长数据相加问题

a875052544 2018-10-06 05:35:57
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main()

{
int d=0,times=1,t;
char a[1005];
int na[1005],sum[1005],ai,i,lenna;
int pre=0;
scanf("%d",&d);
memset(sum,0,sizeof(sum)); //初始化
for(d;d>0;d--) //计算次数
while(1)

{ pre=0;
memset(na,0,sizeof(na));
scanf("%s",&a);
if(a[0]=='0')
break;
lenna=strlen(a);
for(i=0;i<lenna;i++) //转化字符且顺序调换
na[lenna-1-i]=a[i]-'0';

for(ai=0;ai<lenna;ai++) //相加

{
pre=pre/10;
sum[ai]=sum[ai]+na[ai]+pre;
pre=sum[ai];
}
for(i=lenna-1;i>=0;i--){
printf("%d",sum[i]%10);
}



}

for(i=lenna-1;i>=0;i--){
printf("%d",sum[i]%10);
}
if(t)
printf("\n");

return 0;

}

我想要做的是 三个长数据进行相加 但不知道为何第三次数据加出来的结果是错误的 如图

正确答案应该是3703703670
苦恼不知道哪里错了
...全文
373 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2018-10-08
  • 打赏
  • 举报
回复
pre进位多计算了
赵4老师 2018-10-08
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
scanf("%d",&n);
for (j=0;j<n;j++) {
scanf("%s%s",a1,a2);

L=strlen(a1);
for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';

L=strlen(a2);
for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';

for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];

for (i=0;i<MAXLEN;i++) {
if (v3[i]>=10) {
v3[i+1]+=v3[i]/10;
v3[i]=v3[i]%10;
}
}

printf("Case %d:\n", j+1);
printf("%s + %s = ", a1, a2);

z=0;
for (i=MAXLEN-1;i>=0;i--) {
if (z==0) {
if (v3[i]!=0) {
printf("%d",v3[i]);
z=1;
}
} else {
printf("%d",v3[i]);
}
}
if (z==0) printf("0");

printf("\n");
}
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110
zangfong 2018-10-07
  • 打赏
  • 举报
回复
我就在你的代码基础上做了修改。 第一,结果之所以是错的,是因为你重复加了进位的数了。
for(ai=0; ai<lenna; ai++)    //相加
{
    pre=pre/10;
    sum[ai]=sum[ai]+na[ai]+pre;
    pre=sum[ai];
}
for(i=lenna-1; i>=0; i--)
{
    printf("%d",sum[i]%10);
} 
上面的代码你定义了pre,这个是用作进位计数用的,所以sum[ai]应该只保留个位数,否则的话,你在sum[ai]=sum[ai]+na[ai]+pre;这句语句中,进位的数既保留在sum[ai]中,又体现在了pre中,所以你的累加结果肯定比正确结果要大,问题就在这里。 第二,既然是加法,那就会产生进位,那么最高位的进位问题你也是要考虑的; 第三,程序中的t,没明白是什么意思,不过你这么写,这句printf("\n");应该始终是会运行的,因此我去掉了。 第四,你的程序最后还是输出了一遍结果,从程序角度理解,我觉得这个应当是放在for循环之内的,而且如果不放在for循环里头,如果我的程序输入d的值为0,程序就会出错,异常退出。 大概就这些吧。综上,我还是基本按照你的代码的思路进行了修改,供参考。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int d=0,times=1,t;
    char a[1005];
    int na[1005],sum[1005],ai,i,lenna,flag;
    int pre=0;
    scanf("%d",&d);
    memset(sum,0,sizeof(sum)); //初始化
    for(;d>0;d--) //计算次数
    {
        while(1)
        {
            pre=0;
            memset(na,0,sizeof(na));
            scanf("%s",a);
            if(a[0]=='0')
                break;
            lenna=strlen(a);
            for(i=0; i<lenna; i++) //转化字符且顺序调换
                na[lenna-1-i]=a[i]-'0';

            for(ai=0; ai<lenna; ai++)    //相加
            {
                sum[ai]=sum[ai]+na[ai]+pre;
                pre = sum[ai] / 10;
                sum[ai] = sum[ai] % 10;
            }
            flag = 0;
            if(pre)
            {
                flag = 1;
                sum[ai] = pre;
            }
            if(flag) printf("%d",sum[lenna]);

            for(i=lenna-1; i>=0; i--)
            {
                printf("%d",sum[i]);
            }
            printf("\n");
        }

        if(flag) printf("%d",sum[lenna]);
        for(i=lenna-1; i>=0; i--)
        {
            printf("%d",sum[i]);
        }
        printf("\n");

    }

    return 0;

}

33,311

社区成员

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

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