问题标题: 高精度

0
0

0
已采纳
毛润宇
毛润宇
新手天翼
新手天翼

好像都不行(刚发的),看这个:

高精度加法运算概念:

是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算时所用到的算法。

/*
题目:
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
  由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
  最后将C输出即可。
输入格式
  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
  输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
*/
 
    #include<iostream>  
    #include<string.h>  
      
    using namespace std;  
      
    int main(){  
        char a[1111],b[1111];  
        int c[1111];  
        cin>>a>>b;  
        int i,j,k=0;  
        int r=0;  
        for(i=strlen(a)-1,j=strlen(b)-1;i>=0&&j>=0;i--,j--){  
            int p=(a[i]-'0')+(b[j]-'0')+r;    
            r=p/10;     //进位  
            c[k++]=p%10;    //余数加到数组中  
        }  
      
        while(i>=0){   //如果b中的数加完了  
            int p=(a[i]-'0')+r;  
            r=p/10;  
            c[k++]=p%10;  
            i--;  
        }  
        while(j>=0){    //如果a中的数加完了  
            int p=(b[j]-'0')+r;  
            r=p/10;  
            c[k++]=p%10;  
            j--;  
        }  
        if(r){      //判断最高位有没有进位  
            c[k++]=r;  
        }  
        for(int i=k-1;i>=0;i--){    // 输出最后结果  
            cout<<c[i];  
        }  
        return 0;  
    }  
分析:

1.可能两个数的长度不同,那么就需要在一个数加完之后把另一个数的剩下的数全加上。

2.判断最高位,如果最高位有进位,那么还需要把进位位加上。

 

毛润宇在2018-11-29 20:04:06追加了内容

求采纳!

0
0
0
0
范子扬
范子扬
高级守护
高级守护

高精度加法运算概念:



是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算时所用到的算法。



/*

题目:

输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

算法描述

  由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。

  定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。

  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。

  最后将C输出即可。

输入格式

  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出格式

  输出一行,表示a + b的值。

样例输入

20100122201001221234567890

2010012220100122

样例输出

20100122203011233454668012

*/



    #include<iostream>  

    #include<string.h>  



    using namespace std;  



    int main(){  

        char a[1111],b[1111];  

        int c[1111];  

        cin>>a>>b;  

        int i,j,k=0;  

        int r=0;  

        for(i=strlen(a)-1,j=strlen(b)-1;i>=0&&j>=0;i--,j--){  

            int p=(a[i]-'0')+(b[j]-'0')+r;    

            r=p/10;     //进位  

            c[k++]=p%10;    //余数加到数组中  

        }  



        while(i>=0){   //如果b中的数加完了  

            int p=(a[i]-'0')+r;  

            r=p/10;  

            c[k++]=p%10;  

            i--;  

        }  

        while(j>=0){    //如果a中的数加完了  

            int p=(b[j]-'0')+r;  

            r=p/10;  

            c[k++]=p%10;  

            j--;  

        }  

        if(r){      //判断最高位有没有进位  

            c[k++]=r;  

        }  

        for(int i=k-1;i>=0;i--){    // 输出最后结果  

            cout<<c[i];  

        }  

        return 0;  

    }  

分析:



1.可能两个数的长度不同,那么就需要在一个数加完之后把另一个数的剩下的数全加上。



2.判断最高位,如果最高位有进位,那么还需要把进位位加上。

 

https://baike.so.com/doc/8723395-9046003.html

0
叶奥瑞
叶奥瑞
修练者
修练者

高精减法(部分代码)

if(la<lb||(la==lb&&strcmp(a,b)<0)) 
 { 
  strcpy(n,a);  
  strcpy(b,a);  
  strcpy(a,b);  
  cout<<"-"; 
 }  
 int aa[205]={0},bb[205]={0}; 
 for(int i=0;i<=la-1;i++) 
 { 
  aa[la-i]=a[i]-'0'; 
 } 
 for(int i=0;i<=lb-1;i++) 
 { 
  bb[lb-i]=b[i]-'0'; 
 }  
 int i=1,x=0; 
 while(i<=la||i<=lb) 
 { 
  if(aa[la]==0)
   la--;  
  if(aa[i]<bb[i])   
  {  
   aa[i+1]--;   
   aa[i]+=10;  
  }  
  c[i]=aa[i]-bb[i];  
  i++;  
  lc++;
 } 
 bool temp=true; 
 for(int i=lc;i>=1;i--) 
 { 
  if(c[i]==0&&temp==true)
   continue;  
  else
   temp=false;  
  cout<<c[i]; 
 }

我要回答