两个超长数字相加,高手进来修改!

飞天小鱼 2005-10-16 12:51:35
两个超长数字相加,高手进来修改!例如:12345678910236544786665+78994564165746515374897=?
我自己写的程序有点问题,请修改,谢谢!
#include<iostream.h>
void add(int result[11], int buf1[10], int buf2[9])
{
int len =10; //strlen(buf1)<strlen(buf2) ? strlen(buf1): strlen(buf2);
result[9] = (buf1[9] + buf2[8])%10;
for(int i=len-1; i>=0; i--)
{
// result[i] = (buf1[i] + buf2[i-1] ) % 10 +'0';
// result[i-1] = (buf1[i-1] + buf2[i-2] ) / 10 +'0';
// result[i-1]+= (buf1[i] + buf2[i] ) % 10 +'0';
// return result[len];

int a= (buf1[i] + buf2[i-1])/10;
result[i-1] = (buf1[i-1] + buf2[i-2] + a)%10;
}
for(i=0;i<len;i++)
{
cout<<result[i];
}

// return result;
}
void main()
{
int a1[10]={1,2,3,4,5,6,7,8,9,2};
int a2[9]={1,2,3,4,5,6,7,8,9};
int a3[10];
add(a3,a1,a2);

}
...全文
407 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
庄鱼 2005-10-22
  • 打赏
  • 举报
回复
void add(int result[11], int buf1[10], int buf2[10])
{
int len =10; //strlen(buf1)<strlen(buf2) ? strlen(buf1): strlen(buf2);
// result[9] = (buf1[9] + buf2[8])%10;
int k=0;
for(int i=0;i<=len;i++)result[i]=0; //-----------------
for(int i=0;i<len;i++)//len-1; i>=0; i--)
{
// result[i] = (buf1[i] + buf2[i-1] ) % 10 +'0';
// result[i-1] = (buf1[i-1] + buf2[i-2] ) / 10 +'0';
// result[i-1]+= (buf1[i] + buf2[i] ) % 10 +'0';
// return result[len];
//=========================
int a= buf1[i]+buf2[i]+k;
result[i]= a%10;
k = a/10;
//=========================
// int a= (buf1[i] + buf2[i-1])/10;
// result[i-1] = (buf1[i-1] + buf2[i-2] + a)%10;
}
for(int i=len,j=0;i>=0;--i)//0;i<len;i++) //-------------
{
if(result[i])j=1; //---------------
if(j)cout<<result[i]; //---------------
}

// return result;
}
void main()
{
int a1[10]={1,2,3,4,5,6,7,8,9,2};
int a2[10]={1,2,3,4,5,6,7,8,9}; //-----------
int a3[11];
add(a3,a1,a2);

}
wwwindowsxp 2005-10-22
  • 打赏
  • 举报
回复
//QQ: 191580647
#include<iostream.h>
void add(int result[],int num1[],int num2[],int m)
{
int cy=0,temp=0;
for(int i=0;i<m;i++)
{
cy=(num1[i]+num2[i]+temp)/10;
result[i]=(num1[i]+num2[i]+temp)%10;
temp=cy;
}
result[i]+=temp;
}
void main()
{
int i,k;
int m=100;
cout<<"Input : num1 num2"<<endl;
//输入为:num1(非数字字符) num1(非数字字符)
// 或 num1(非数字字符) num1(非数字字符)
//例:12345678910236544786665c78994564165746515374897c
int num1[100]={0};
int num2[100]={0};
char temp[100]={0};
int result[101]={0};
/////////////////////////////////////////////////////////
for(i=0;i<m;i++)
{
cin>>temp[i];
if(temp[i]>0x39||temp[i]<0x30) {temp[i]=0;k=i;break;}
}
for(i=0;i<k;i++) num1[i]=int(temp[(k-1-i)]-0x30);
int j=0;
for(i=m-1;i>=0;i--)
{
if(num1[i]==0&&j==0) continue;
j=1;
cout<<num1[i];
}
cout<<endl;
/////////////////////////////////////////////////////////
for(i=0;i<m;i++) temp[i]=0;
for(i=0;i<m;i++)
{
cin>>temp[i];
if(temp[i]>0x39||temp[i]<0x30) {temp[i]=0;k=i;break;}
}
for(i=0;i<k;i++) num2[i]=int(temp[(k-1-i)]-0x30);
j=0;
for(i=m-1;i>=0;i--)
{
if(num2[i]==0&&j==0) continue;
j=1;
cout<<num2[i];
}
cout<<endl;
/////////////////////////////////////////////////////////
add(result,num1,num2,m);
////////////////////////////////////////////////////////
j=0;
for(i=m;i>=0;i--)
{
if(result[i]==0&&j==0) continue;
j=1;
cout<<result[i];
}
cout<<endl;
}
wwwindowsxp 2005-10-22
  • 打赏
  • 举报
回复
minjunyu (飞天小鱼) :你的问题搞定了吧?
庄鱼 2005-10-22
  • 打赏
  • 举报
回复
将上述代码改成字符串方式,虽然效率低了点,但适用于任意足够大数
const char* add(char *sum, const char *one, const char *two)
{
int len,len1,len2;
len1 = strlen(one);
len2 = strlen(two);
len=len1>len2?len1:len2;
sum[len+1]=0;
int a,b,c,inc=0;
for(int i=len,j=len1-1,k=len2-1;i>=0;--i,--j,--k){
b = j>=0?one[j]-'0':0;
c = k>=0?two[k]-'0':0;
a = b+c+inc;
if(j>=0||k>=0||a>0)
sum[i] = a%10+'0';
else
sum[i] = 0x20;
inc = a/10;
}
return sum;
}

void main()
{
char a1[]="1234567892";//{1,2,3,4,5,6,7,8,9,2};
char a2[]="123456789";//{1,2,3,4,5,6,7,8,9};
char a3[14];
add(a3,a1,a2);
cout <<a3;
}
fengie_wen 2005-10-21
  • 打赏
  • 举报
回复
如果你愿意的话,加我QQ:122500865,很愿意和你成为朋友。^_^
fengie_wen 2005-10-21
  • 打赏
  • 举报
回复
引:
---------------------------------------------------------------------------
还有我发觉if(i-1>=0)
{
result[i] = (num1[i] + num2[i-1] + tmp)%10;
tmp = (num1[i] + num2[i-1])/10;
}
else
{
result[i] = num1[i]+tmp;
tmp=0;
}
中的if语句好象是没有用的,或许你说出它的作用是什么啊

-----------------------------------------------------------------------

这里还是一个边界的问题,如果没有这句的话,一个10位char和一个9位char的数是没法正确相加的啊,因为有num1[10]而没有num2[10],有num1[0]却没有num2[-1]一样,都是非法访问不属于他本身的内存地址。
redsuyu 2005-10-19
  • 打赏
  • 举报
回复
我写了一个
先转置方向, 再相加

#include <memory.h>
#include <iostream>
#include <string.h>
using namespace std;
void reverse( char * p , char * p2 )
{
int len = strlen(p);
char * p_r = p2;

for( int i = 0 ; i< len ; i++ )
{
* p_r ++ = p[len-1-i];

}
* p_r='\0';

}

void add( char * p1 , char * p2,char * t )
{
int add = 0 ;
int tmp = 0 ;
char * result = t;

while( * p1 !='\0' || * p2 != '\0' )
{
if( (* p1 !='\0' )&& (* p2 != '\0') )
{
tmp = (* p1++ )+ (* p2 ++ )+add -2* '0';
add = tmp/10 ;
*result ++ = tmp%10+ '0';
}
else
{
if( * p1 == '\0')
{
tmp = (* p2 ++ ) + add - '0';
add = tmp/10 ;
*result ++ = tmp %10+ '0';
}
else
{
tmp = (* p1 ++ ) + add - '0';
add = tmp/10 ;
*result ++ = tmp %10+ '0';
}
}
}
* result = '\0';
}
void main()
{
char a1[256] , a1_r[256];

char a2[256] , a2_r[256];
char result [257];
char result_r[257];


cout<<"a1 "<<endl;
cin>>a1;
cout<<"a2"<<endl;
cin>>a2;

reverse(a1,a1_r);
reverse(a2,a2_r);

add( a1_r,a2_r, result);

reverse(result, result_r);
cout<< result_r<<endl;
}
飞天小鱼 2005-10-19
  • 打赏
  • 举报
回复
我还发现了一个问题,就是两个数组的第一位也就num1[0]和num2[0]如果是1和9的时候,他们相加也是不能进位的 ,拿num1[10]={1,6,4,7,1,1,1,5,5,5}和num2[10]={9,5,5,5,5,5,5,6,5,6}相加你会发现其中的错误,特别是在1和9相加时是错误的。
飞天小鱼 2005-10-19
  • 打赏
  • 举报
回复
还有我发觉if(i-1>=0)
{
result[i] = (num1[i] + num2[i-1] + tmp)%10;
tmp = (num1[i] + num2[i-1])/10;
}
else
{
result[i] = num1[i]+tmp;
tmp=0;
}
中的if语句好象是没有用的,或许你说出它的作用是什么啊
飞天小鱼 2005-10-19
  • 打赏
  • 举报
回复
大家都是才疏学浅,还看来你还是比我厉害得多,我发现了,想了很久,就是想不出来,我一看你的代码才 恍然大悟。以后看来有多交流啊
fengie_wen 2005-10-19
  • 打赏
  • 举报
回复
还是我,那个程序我看了一下是存在这样的问题,我的修改如下:

还是我的程序,修改后的样子。
tmp = (num1[i] + num2[i-1])/10;
=》
tmp = (num1[i] + num2[i-1] + tmp)/10;

修改这一句就好了,因为本位的进位没有考虑到后面的进位所以才会出现当相加数为9时得不到进位。
飞天小鱼 2005-10-19
  • 打赏
  • 举报
回复
很可惜,redsuyu()你的也是不能实现正确的结果,还请你回去在仔细想想,我也在思考啊,大家一起解决这个问题,我也是这么想的,先把要加的两个数组逆序,在相加后在把结果数组逆序,这是我的思路,目前我的程序正在调试中。望高手进来帮助我们这些新手!
飞天小鱼 2005-10-18
  • 打赏
  • 举报
回复
晕,怎么会没有人来顶一下呢?高手们,来看看 啊,顶一下 啊
飞天小鱼 2005-10-17
  • 打赏
  • 举报
回复
经过我仔细的测试我发现你写个我的程序有点问题。你把相加的数组改为{3,5,6}和{3,4,9}你有这两个 数组相加,你就会发现它的得数不是705,而是605,在4和5相加时,它没有进位。
fengie_wen 2005-10-17
  • 打赏
  • 举报
回复
呵呵~~~~~~~~~~努力学习~~~~~~~~~~~~~~
飞天小鱼 2005-10-17
  • 打赏
  • 举报
回复
怎么没有人来发表意见的啊 ?我把我的两个程序都放上去,两个都是我修改后的程序,但是都没有解决当两个数组中是4和5相加的时候,他都不能进位,就像我上面说的一样。请高手看看啊。
第一程序:
#include<iostream.h>
void add(int result[10],int num1[10],int num2[10])
{
result[9]=(num1[9]+num2[9])%10;
int b=(num1[9]+num2[9])/10;
for(int i=8;i>=0;i++)
{
result[i]=(num1[i]+num2[i])%10;
b=(num1[i]+num2[i]+b)/10;
}
}
void main()
{
int num1[10]={1,2,3,4,5,6,7,4,9,3};
int num2[10]={3,2,4,5,6,8,7,5,1,8};
int result[10];
add(result,num1,num2);
for(int i=0;i<10;i++)
{
cout<<result[i];
}
}
第二个程序:

#include<iostream.h>
void add(int result[10], int num1[10], int num2[10]);
void main()
{
int num1[10] = {1,6,4,7,1,1,1,5,5,5};
int num2[10] = {2,5,5,7,3,4,5,4,7,9};
int result[10];
add(result, num1, num2);

}

void add(int result[10], int num1[10], int num2[10])
{
int tmp=0;
for(int i=9; i>=0; i--)
{
if(i-1>=0)
{
result[i] = (num1[i] + num2[i] + tmp)%10;
tmp = (num1[i] + num2[i])/10;
}
else
{
result[i] = num1[i]+tmp;
tmp=0;
}
}
for(i=0;i<10;i++)
{
cout<<result[i];
}
}
飞天小鱼 2005-10-16
  • 打赏
  • 举报
回复
fengie_wen(水滴石穿) 谢谢你 啊,我也是才疏学浅啊,不然怎么在这里发帖求助啊
fengie_wen 2005-10-16
  • 打赏
  • 举报
回复
好象是由于buf2[i-2]越界造成的,因为循环里i=0时,buf1[i-1],buf[i-2]都使用了不属于数组本身的数值,我给出我的代码,本人才疏学浅,有不对的地方还请多多批评!!

#include<iostream>

int add(int result[10], int num1[10], int num2[9]);

int main(void)
{
int num1[10] = {1,6,1,7,1,1,1,1,1,5};
int num2[10] = { 5,1,2,3,4,5,6,7,9};
int result[10];
add(result, num1, num2);
for(int i=0;i<10;i++)
std::cout<<result[i];
return 0;
}

int add(int result[10], int num1[10], int num2[9])
{
int tmp(0);
for(int i=9; i>=0; i--)
{
if(i-1>=0)
{
result[i] = (num1[i] + num2[i-1] + tmp)%10;
tmp = (num1[i] + num2[i-1])/10;
}
else
{
result[i] = num1[i]+tmp;
tmp=0;
}
}
return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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