hdu1002 大数运算

题目要求:
hdu1002 大数运算_第1张图片
简而言之就是输入任意两数进行求和,因为数字很大,所以直接求和显然不行,所以想到了用字符串来做(模拟加法运算)(也可以用数组做)
//格式就不细说了
#include <stdio.h>
#include <string.h>
int change(char a[1010],char b[1010]) { char c[1010]; int i,j; int max=(strlen(a)>=strlen(b))?strlen(a):strlen(b); if(strlen(a)>=strlen(b)) { for(i=strlen(a)-1,j=strlen(b)-1;i>=0;i--,j--) { if(j>=0)
            c[i]=b[j]; else
            c[i]='0';// 这一步很关键,将长度较小的字符串赋值给另一个字符串,较短的字符串空位置放字符'0'这样就能使两个相加的字符串对齐了; }
      for(i=max-1;i>=0;i--) { if((a[i]+c[i]-48)<='9') {
            a[i]=a[i]+c[i]-48; // -48 相当于 -'0' 因为字符0的asc码值为48; } else {
            	a[i]=a[i]+c[i]-48-10; 如果a[i]+c[i]-48的值大于'9'那么再减掉10 就相当于进位后该位的值;   if(i-1>=0)
            	a[i-1]+=1;   if(i-1==-1)
          	  printf("1");//当字符串运算到第一位是也就是a[0]+c[0]可能会出现进位,但字符串已经没有空位置,考虑到两个数加法最多进1,所 //这种情况就先输出'1'; } }
        printf("%s\n",a); } if(strlen(b)>strlen(a)) { for(i=strlen(b)-1,j=strlen(a)-1;i>=0;i--,j--)//同上 { if(j>=0)
            c[i]=a[j]; else
            c[i]='0'; } for(i=max-1;i>=0;i--) { if(b[i]+c[i]-48<='9')
            b[i]=b[i]+c[i]-48; else {
            b[i]=b[i]+c[i]-48-10; if(i-1>=0)
            b[i-1]+=1; if(i-1==-1)
            printf("1"); } }
        printf("%s\n",b); } } int main() { int i=0,n;
    scanf("%d",&n); while(n--) { char a[1010]; char b[1010]; if(i>=1)
        printf("\n");//控制格式, 每两个Case之间有空行,最后一行没有
        scanf("%s",a);
        scanf("%s",b);
        printf("Case %d:\n",++i);
        printf("%s + %s = ",a,b);
        
        change(a,b); } return 0; }
测试数据 
99900 00999
00999 99900
000 0000
0 0
1000 0001
9999 1
1 9999
这几个数据和样例都过了,应该可以AC了
 以上测试数据由
ultimater的博客提供,下面是他的博客hdu1002博客链接
http://blog.csdn.net/ultimater/article/details/7884836
   
   
   
   

你可能感兴趣的:(ACMbegin)