hdu_1002 大数相加----高精度问题
2012-01-09 12:41 java环境变量 阅读(286) 评论(0) 收藏 举报 话说当初在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
浙公网安备 33010602011771号