题目连接http://acm.hdu.edu.cn/showproblem.php?pid=1877
我做这个题的方法比较笨,由于题目中要输入的两个数的和可能超过整数的范围,所以我采取的是先将两个数转换为m进制的数,然后在进行运算
对于大数的加法,用到的方法和hdoj 1002中的方法一样,只不过这里用到的是整型数组
下面给出大数加法核心算法,如果两个数转换为m进制后,存放在数组里的长度一致,进行如下操作
if(jz(m,c)==jz(m,b))//jz(m,b)为十进制b,转换为m进制后存放在整型数组中的长度。 { for(t=0;t<jz(m,b);t++) { if(s1[t]+s2[t]+jw<m){s[t]=s1[t]+s2[t]+jw;jw=0;}//jw为进位,s[i]存放最终结果 else {s[t]=s1[t]+s2[t]+jw-m;jw=1;} } }如果两个数转换为m进制后,存放在数组里的长度不一致,进行如下操作(需进行两次这样的操作 既:a>b一次,b>a一次)
else if(jz(m,c)>jz(m,b)) { for(t=0;t<jz(m,b);t++) { if(s1[t]+s2[t]+jw<m){s[t]=s1[t]+s2[t]+jw;jw=0;} else {s[t]=s1[t]+s2[t]+jw-m;jw=1;} } for(t=jz(m,b);t<jz(m,c);t++) { if(s1[t]+jw<m){s[t]=s1[t]+jw;jw=0;} else {s[t]=s1[t]+jw-m;jw=1;} } }if(jw==1)s[t++]=1;//判断最后一位有没有进位
最后贴上进制转换函数
int jz(int m,int x) { memset(a,sizeof(a)); int i=0; while(x) { a[i++]=x%m; x=x/m; } return i; }
贴上一个简单的
int a[20]; int jz(int m,sizeof(a)); int i=0; while(x) { a[i++]=x%m; x=x/m; } return i; } int main() { int m,c,b,j;long s; while(cin>>m&&m!=0) { cin>>c>>b; s=c+b; if(s==0)cout<<"0"<<endl; else { j=jz(m,s); for(j=j-1;j>=0;j--) cout<<a[j]; cout<<endl; } } return 0; }