关于大数相加的诡异问题!

skineffect 2008-06-28 05:35:47
自己做了一个acm的大数相加的题,有一个地方很诡异,百思不得其解:
题目:计算2个超级大数的和
Input
输入只有2个超级大数A,B,以空格分开。

A,B最多有100位。
Output
输出只有一个数 即为 A、B之和。
Sample Input
111111111111111111111111111 111111111111111111111111112Sample Output
222222222222222222222222223
我的基本思路是用char数组存储输入,然后用S函数完成相加(将两个char数组的每一位转变为int然后相加,将结果储存到一个int数组中),最后从int数组第一个不是零的高位开始输出,程序如下:
#include<iostream>
#include<string>
using namespace std;
int sum[101];
int Small(int x,int y){
if(x>y)
return y;
else
return x;
}
int Big(int x,int y){
if(x<y)
return y;
else
return x;
}
void S(char *a,char *b,int na,int nb){
int temp=0;
int ns=Small(na,nb);
int ng=Big(na,nb);
for(int i=0;i<=ns-1;i++){
temp=(int)(a[i]-'0')+(int)(b[i]-'0');
sum[i]+=temp;
sum[i+1]+=sum[i]/10; //考虑进位
sum[i]=sum[i]%10;
}
for(int j=ns;j<=ng-1;j++){ //处理位数多的家数的多出来的高位
if(ng==strlen(a)){
sum[j]+=(int)(a[j]-'0');
sum[j+1]=sum[j]/10;
sum[j]=sum[j]%10;
}
else if(ng==strlen(b)){
sum[j]+=(int)(b[j]-'0');
sum[j+1]=sum[j]/10;
sum[j]=sum[j]%10;
}
}

}
int main(){
char a[100],b[100];
cin>>a>>b;
int na=strlen(a);
int nb=strlen(b);
S(a,b,na,nb);
int k=149;
while(sum[k]==0) //找到sum中第一个不是零的位。
k--;
for(int i=k;i>=0;i--)
cout<<sum[i];
cout<<endl;
cin>>k;
}
诡异的地方在这,当我输入的两个数每位都相同时,结果是对的,比如11111111,9999999999,输出10011111110.
但只要有一位上的数与其他的不同就是错的,比如11111110,9999999999,输出10001111110(显然错的!!!),
help......:-)


...全文
100 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
skineffect 2008-06-28
  • 打赏
  • 举报
回复
明白了,关键问题是例如:
char a[4];
cin>>a;
假设输入1234,相当于a[0]=1,a[1]=2,a[2]=3,a[3]=4,对应着数组中的排列是4321,我给弄反了,真是白痴。。。。什么时候才能达到飞雪的水平啊。。。
谢谢了。
simo110 2008-06-28
  • 打赏
  • 举报
回复
同意楼上的
K行天下 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 baihacker 的回复:]
C/C++ code
//小改一下

#include <iostream>
#include <string>
using namespace std;
int sum[101];

void S(char *a,char *b)
{
int a_last = strlen(a)-1;
int b_last = strlen(b)-1;
int i, j, t;
memset(sum, 0, sizeof(int)*101);
for (i=0;;++i)
{
if (a_last>=0&&b_last>=0)
sum[i] = a[a_last--] - '0' + b[b_last--] - '0';
else if (a_…
[/Quote]
飞雪总是第一时间啊!
baihacker 2008-06-28
  • 打赏
  • 举报
回复

//小改一下

#include <iostream>
#include <string>
using namespace std;
int sum[101];

void S(char *a,char *b)
{
int a_last = strlen(a)-1;
int b_last = strlen(b)-1;
int i, j, t;
memset(sum, 0, sizeof(int)*101);
for (i=0;;++i)
{
if (a_last>=0&&b_last>=0)
sum[i] = a[a_last--] - '0' + b[b_last--] - '0';
else if (a_last>=0) sum[i] = a[a_last--]-'0';
else if (b_last>=0) sum[i] = b[b_last--]-'0';
else break;
}
for (j = t = 0;j < i; ++j)
{
t += sum[j];
sum[j] = t%10;
t /= 10;
}
while (t) sum[j++] = t%10, t/=10;
}
int main(){
char a[100],b[100];
cin>>a>>b;
int na=strlen(a);
int nb=strlen(b);
S(a,b);
int k=100;
while(sum[k]==0) //找到sum中第一个不是零的位。
k--;
for(int i=k;i>=0;i--)
cout <<sum[i];
cout <<endl;
cin>>k;
}
baihacker 2008-06-28
  • 打赏
  • 举报
回复
你怎么从最高位向最低位加了?
应该反过来.

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧