【备战蓝桥,冲击省一】高精度算法实现加减乘除

简介: 【备战蓝桥,冲击省一】高精度算法实现加减乘除

d0c76b59d488c751940fcd8c67faa4de_28d539c03e6a47c0b3aa8dbbb5e6e0e4.png


🌸前言


我们来看这样一道题目

计算3564415315842139213685984526842352952356之和,减,乘,除


当我们需要对这样的数进行加,减,乘,除运算时,用传统的方法会超出标准数据类型能表示的数据大小范围。那么应该怎么办呢?

这里就需要用到高精度算法了。


🌸什么是高精度?


高精度算法是处理大数字的数学计算方法。在计算中,数可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数。对高精度数字进行运算时,显然不能用普通的方法了。

怎么办呢?


我们可以使用数组来一位一位存储大数字,采用小学竖式的思维来实现高精度数运算,举个例子

234+567


image.png


我们分别计算每一位两项之和,若结果大于10,则前一位进一,继续运算,直到得出结果。


总结一下,实现高精度算法分为以下几步:


1️⃣ 用数组分别存储高精度数的每一位


2️⃣ 计算同一位的结果


3️⃣ 或结果大于10,向前一项进一,若结果小于10,保持不变


4️⃣ 继续计算下一位,直到运算结束


🌸高精度加法


💬 代码演示

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
  string str1,str2;
  int a[250],b[250],len1,len2,len;
  memset(a,0,sizeof(a));  
  memset(b,0,sizeof(b));  
  cin>>str1>>str2;
  len1=str1.size();
  len2=str2.size();
  for(int i=0;i<=len1;i++)
  {
    a[i]=str1[len1-i]-'0';
  }
  for(int i=0;i<=len2;i++)
  {
    b[i]=str2[len2-i]-'0';
  }
  len=max(len1,len2);
  for(int i=1;i<=len;i++)    
  {  
      a[i]+=b[i];  
      a[i+1]+=a[i]/10;  
      a[i]%=10;     
  }  
  len++;    
  while((a[len]==0)&&(len>1)) len--;  
  for(int i=len;i>=1;i--)  
      cout<<a[i];  
  return 0;
}


🌸高精度减法


💬 代码演示

#include<iostream>  
#include<cstring>
using namespace std;  
int compare(string s1,string s2);  
int main()  
{  
    string str1,str2;  
    int a[250],b[250],len1,len2;  
  int i;  
  memset(a,0,sizeof(a));  
    memset(b,0,sizeof(b));  
    cin>>str1>>str2;  
    len1=str1.length();  
    for(i=1;i<=len1;i++)  
      a[i]=str1[len1-i]-'0';  
    len2=str2.length();  
    for(i=1;i<=len2;i++)  
      b[i]=str2[len2-i]-'0';  
    if((compare(str1,str2))==0)   
    {  
      for(i=1;i<=len1;i++)  
        {
        a[i]-=b[i];  
          if (a[i]<0) 
      {
        a[i+1]--;
        a[i]+=10;
      }  
        }  
    len1++;  
    while((a[len1]==0)&&(len1>1)) 
    len1--;  
    for(i=len1;i>=1;i--)  
        cout<<a[i];  
    cout<<endl;   
  }                            
  else  
  {  
    cout<<'-';    
    for(i=1;i<=len2;i++)   
    {
      b[i]-=a[i];  
      if (b[i]<0) 
    {
        b[i+1]--;
      b[i]+=10;
    }  
    }  
    b[0]++;  
    while((b[len2]==0)&&(len2>1)) 
    len2--;  
    for(i=len2;i>=1;i--)  
        cout<<b[i];  
    cout<<endl;          
  }  
  return 0;   
}  
int compare(string s1,string s2)    
{  
  if(s1.length()>s2.length()) return 0;  
  if(s1.length()<s2.length()) return 1;  
  for(int i=0;i<=s1.length();i++)    
  {  
    if(s1[i]>s2[i]) return 0;  
    if(s1[i]<s2[i]) return 1;                            
  }  
  return 0;   
}  


🌸高精度乘法


💬 代码演示

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
  string str1,str2;
  int a[250],b[250],c[250],len1,len2,len;
  memset(a,0,sizeof(a));  
  memset(b,0,sizeof(b));  
  memset(c,0,sizeof(c)); 
  cin>>str1>>str2;
  len1=str1.size();
  len2=str2.size();
  for(int i=0;i<=len1;i++)
  {
    a[i]=str1[len1-i]-'0';
  }
  for(int i=0;i<=len2;i++)
  {
    b[i]=str2[len2-i]-'0';
  }
  for(int i=1;i<=len1;i++)
  {
    for(int j=1;j<=len2;j++)
    {
      c[i+j-1]+=a[i]*b[j];
      c[i+j]+=c[i+j-1]/10;
      c[i+j-1]%=10;
    }
  } 
  len=len1+len2+1; 
  while((c[len]==0)&&(len>1)) len--;  
  for(int i=len;i>=1;i--)  
      cout<<c[i];  
  return 0;
}


🌸高精度除法


💬 代码演示

#include<iostream>
#include<cstring>
using namespace std;
int a[100],b[100],c[100];
int compare(int a[],int b[])
{
    if(a[0]>b[0])
        return 1;
    if(a[0]<b[0])
        return -1;
    for(int i=a[0];i>0;i--)
    {
        if(a[i]>b[i])
            return 1;
        if(a[i]<b[i])
            return -1;
    }
    return 0;
}
void subduction(int a[],int b[])
{
    int flag;
    flag=compare(a,b);
    if(flag==0)
    {
        a[0]=0;
        return;
    }
    if(flag==1)
    {
        for(int i=1;i<=a[0];i++)
        {
            if(a[i]<b[i])
            {
                a[i+1]--;
                a[i]+=10;
            }
            a[i]-=b[i];
        }
        while(a[0]>0&&a[a[0]]==0)
            a[0]--;
        return;
    }
}
int main()
{
    char str1[100],str2[100];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    cin>>str1>>str2;
    a[0]=strlen(str1);
    b[0]=strlen(str2);
    for(int i=1;i<=a[0];i++)
        a[i]=str1[a[0]-i]-'0';
    for(int i=1;i<=b[0];i++)
        b[i]=str2[b[0]-i]-'0';
    int temp[100];
    c[0]=a[0]-b[0]+1;
    for(int i=c[0];i>0;i--)
    {
      memset(temp,0,sizeof(temp));
        for(int j=1;j<=b[0];j++)
            temp[j+i-1]=b[j];
        temp[0]=b[0]+i-1;
        while(compare(a,temp)>=0)
        {
            c[i]++;
            subduction(a,temp);
        }
    }
    while(c[0]>0&&c[c[0]]==0)
        c[0]--;
    cout<<"商为:";
    if(c[0]==0)
        cout<<0<<endl;
    else
    {
        for(int i=c[0];i>0;i--)
            cout<<c[i];
        cout<<endl;
    }
    cout<<"余数为:";
    if(a[0]==0)
        cout<<0<<endl;
    else
    {
        for(int i=a[0];i>0;i--)
            cout<<a[i];
        cout<<endl;
    }
    return 0;
}


🌺每日金句


即使是不成熟的尝试,也胜于胎死腹中的策略。

00f1bbbed2bde00c15f23895e0318d1b_225846d0d23d43ac903cfd279e74d01d.png


   本人不才,如有错误,欢迎各位大佬在评论区指正。有帮助的话还请【关注点赞收藏】,不行的话我再努努力💪💪💪


相关文章
|
6月前
|
算法
算法基础:高精度运算
算法基础:高精度运算
81 0
|
存储 算法
【算法基础】高精度运算
【算法基础】高精度运算
50 0
|
1月前
|
存储 人工智能 算法
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
|
1月前
|
算法 C++
蓝桥 算法训练 共线(C++)
蓝桥 算法训练 共线(C++)
|
4月前
|
机器学习/深度学习 人工智能 文字识别
一种基于YOLOv8改进的高精度红外小目标检测算法 (原创自研)
【7月更文挑战第2天】 💡💡💡创新点: 1)SPD-Conv特别是在处理低分辨率图像和小物体等更困难的任务时优势明显; 2)引入Wasserstein Distance Loss提升小目标检测能力; 3)YOLOv8中的Conv用cvpr2024中的DynamicConv代替;
434 4
|
6月前
|
算法 C++
c++算法学习笔记 (4)高精度运算
c++算法学习笔记 (4)高精度运算
|
6月前
|
人工智能 算法 BI
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
|
6月前
|
存储 算法 索引
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)
|
6月前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
65 0
|
6月前
|
存储 算法 安全
【数据结构与算法初学者指南】【冲击蓝桥篇】String与StringBuilder的区别和用法
【数据结构与算法初学者指南】【冲击蓝桥篇】String与StringBuilder的区别和用法