题目连接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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。