hdu_1002 大数相加 高精度问题

话说当初在hdu上看过这题,只是那时盲目自信的以为很容易实现,所以跳了过去。 昨晚上准备搞这个算法,满怀信心的敲完代码,却总是有这样那样的问题。 虽然还是能做出来,但给本人的打击还是蛮大的。
下面我写一下我的思路。
先以字符串的方式输入两"数".字符串的每个元素代表一个数位上的数字。
把字符串的每个元素转化成相应的数字储存在一个数组中。
再模拟加法运算。
例如: 输入789 56
0 9 8 9
+ 0 5 6
___________________
1 0 4 5
最高位都赋为0是因为 可能两数相加后会多一个数位。
最后输出的时候判断一下最高位是否为零就可以了。


//下面就是模拟加法运算的算法 for(i=len;i>=0;i--) { n[i]=(l[i]+s[i]+k)%10; if(l[i]+s[i]+k>9) k=1;//k用于记录是否进1; else k=0; }




再写几句,我以前对有些问题想不清楚时,也喜欢百度。但前些天看了 一位ACM大牛 sanxian 写的篇博客,受了点启发,直接搜代码,对自己能力的提高没什么用处。不要想着直接看别人代码,有问题时,先一定要有耐心和信心自己去努力想出来,实在想不出,再和别人去交流交流算法。

所以,如果有喜欢搞算法的朋友,欢迎交流算法。^_^

2012. 01. 09

今天重新做了一下这题。得出点经验,一道题不能只是Ac了就不管了,一道已经Ac的题 重做一遍还是能发现 很多东西。下面是我今晚写的代码。相比于以前还是有点进步的。

#include<stdio.h> #include<string.h> #define MAX 1000 int main() { char a[MAX],b[MAX]; int sum[MAX+1]; int t,count=1; while(scanf("%d",&t)!=EOF) { while(t--) { int i,j,carry=0; scanf("%s%s",a,b); memset(sum,0,sizeof(sum)); //初始化函数memset. //将字符串转为数组形式 for(i=strlen(a),j=0;i>=0;--i,j++) sum[j]=a[i]-'0'; for(i=strlen(b),j=0;i>=0;--i,j++) sum[j]+=b[i]-'0'; // 进位运算 for(i=0;i<=(strlen(a)>strlen(b)?strlen(a):strlen(b));i++) if(sum[i]>9) { sum[i]-=10; sum[i+1]++; } printf("Case %d:\n",count++); //控制格式 printf("%s + %s = ",a,b); //控制格式 for(j=MAX;j>=0;j--) if(sum[j]) break; //去掉高位多余的0 for(i=j;i>0;i--) printf("%d",sum[i]); //控制格式 printf("\n"); if(t!=0) printf("\n"); } } return 0; }
2012. 02 .02
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值