ACM 大数 A+B Problem

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=513

描述:

             acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。

在编程中遇到的问题:

             在输出结果的过程中一直出现错误,因为在该过程中需要去掉一些无效的0,比如小数部分最后面的0,整数部分最前面的0

我的收获:

                       第一次接触大数运算,理解了大数运算的基本模式,由于数字位数太多,无法用int或者更多位数比如long double的数据类型去存储,所以需要用数组存储,并且使用

             手工模拟的方式进行运算。

                      大数加法的手工模拟过程:                                          

               for(i=0;i<820;i++){

         s=a1[i]+a2[i]+v;
          result[i]=s%10;
          v=s/10;
        }
代码:

/*把两个数当字符串输入,存放到两个数组中。再检测是否有小数点,
开两个数组大小为前面两倍,中间一个位置存放小数点,小数点左边存放小数部分,
小数点右边存放整数部分(倒着存放)。然后两个倒序后的数组相加,用
第三个同等大小的数组存放结果。同时检测整数部分前面的零和小数部分后面的零,
去掉多余的零。详细看代码部分。*/
#include 
#include 
char s1[410],s2[410];
int a1[820],a2[820];
int result[820];

void init(){//初始化函数
  memset(a1,0,sizeof(a1));
  memset(a2,0,sizeof(a2));
  memset(result,0,sizeof(result));
}

void create(int a[],char s[]){//将字符串数组赋给整型数组
   int len,k,i,j=0;
   len=strlen(s);
   if(strchr(s,'.')!=NULL)
     k=strchr(s,'.')-s;
   else
     k=len;
    //i表示字符串,j表示整型
    for(i=k+1,j=399;i=0;i--,j++)
      a[j]=s[i]-'0';
}

void sum(){//求和函数
   int s,v=0,i;
   for(i=0;i<820;i++){
     s=a1[i]+a2[i]+v;
     result[i]=s%10;
     v=s/10;
   }
}

void print(){
    int i=820,j=0;
    while(result[i]==0&&i>=400)
        i--;
    while(result[j]==0&&j<400)
        j++;
    if(i==399&&j==400)
        printf("0\n");
    else
    {
        while(i>399)
            printf("%d",result[i--]);
        if(j!=400)
         printf(".");
       for(i=399;i>=j;i--)
            printf("%d",result[i]);
            printf("\n");
    }
}
int main(){

    while(scanf("%s %s",&s1,&s2)!=EOF){
        init();
        create(a1,s1);
        create(a2,s2);
        sum();
        print();
    }
return 0;
}


你可能感兴趣的:(ACM 大数 A+B Problem)