请问这个大数加法是哪里出错了呢,我怎么找也找不到问题是出在哪里

「已注销」 2013-04-26 01:59:30
代码在这里:http://www.jiketie.com/122

程序运行是输入的大数位数相同就能得到正确结果,不然就会出错,像下面这样子

数据 10 20 30 1111 1111 1111
1 1 1 1 11 111
结果 -91 -81 -71 -9-9-92 -9-922 -9-9222
...全文
79 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-04-26
  • 打赏
  • 举报
回复
#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
hugett 2013-04-26
  • 打赏
  • 举报
回复
引用 3 楼 hpx1992 的回复:
[quote=引用 1 楼 hugett 的回复:] C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081#include<iostream>#incl……
谢谢你,按照你说的做后程序就对了,但不是很明白,能否麻烦你再跟我讲讲呢? “http://blog.csdn.net/sibylle/article/details/2026915中有下面这段话: 如果不对数组进行初始化,即在定义的同时没有用列表初始化,那么局部数组的值就取决于编译器而对程序员来说就是不可预料的了.有时间可以测试一下各个编译器,不过在vc中是0xcc.所以对局部数组的初始化要特别小心.但是全局的数组和静态数组还是会被正确的赋于0值的.” 是不是因为data1、data2在定义时都初始化了,没有被赋值的都会被赋于0值 而data没有初始化 只是将data[i]=data1[i]+data2[i],剩下的都没有置0,所以就像你说的“1+10, 会变成x1+10, 其中x是个随机数” 但这个随机数为什么在测试的数据中是有规律的呢,比如1会变成-9,2变成-8,3变成-7[/quote] 说是随机数,但对于VC,它是一个定值0xcccccccc, 而(0xcccccccc + 1) % 10 = -9, 所以如果你没有初始化,则1 + 10会变成(0xcccccccc)1 + 10, 那么按照你的算法就会得到-91 但说归说,我们不应该利用编译器的这种特性,因为你换一个编译器可能就不是这个值了。。
「已注销」 2013-04-26
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:

#include<iostream>
#include<string.h>
const int N=1000;
using namespace std;

typedef struct DATA{
	int num[1000];
	int len;
}DATA;

//翻转大数
DATA turnstr(DATA &data)
{
	int t;
	int midlen=data.len/2;
	int lastnum=data.len-1;
	for(int i=0;i<midlen;i++)
	{
		t=data.num[i];
		data.num[i]=data.num[lastnum];
		data.num[lastnum]=t;
		lastnum--;
	}
	return data;
}

//将输入的char型大数数组 转化 为int型大数数组
DATA chartoint(char *str,DATA &data)
{
	memset(data.num, 0, sizeof(data.num));//要把大于data.len的那些位置0。。
	data.len=strlen(str);
	for(int i=0;i<data.len;i++)
		data.num[i]=(int)str[i]-'0';
	return data;
}

//输出大数
void output(DATA data)
{
	for(int i=0;i<data.len;i++)
		cout<<data.num[i];
	cout<<endl;
}

//加法
DATA plus(DATA &data1,DATA &data2,DATA &data)
{
	int maxlen=(data1.len>=data2.len)?data1.len:data2.len;
	data.len=maxlen;                                  
	int add=0;
	for(int i=0;i<maxlen;i++)
	{
		//如果前边不置0,当长度不同时这里就会有问题。
		//例如1+10, 会变成x1+10, 其中x是个随机数, 所以出来的答案就错了。。
		data.num[i]=(data1.num[i]+data2.num[i]+add) %10;
		if(data1.num[i]+data2.num[i]+add >=10)
			add=1;
		else add=0;
	}

    if (add==1)   //加完最后一位还要进位的情况
	{
		data.len++;
		data.num[data.len-1]=1;
	}
	return data;
}

int main()
{
	char str1[N];
	char str2[N];
	DATA data1;
	DATA data2;
	DATA data;
	cout<<"请输入两个大数:"<<endl;
	gets(str1);
	gets(str2);
	output(turnstr( plus(turnstr(chartoint(str1,data1)),   turnstr(chartoint(str2,data2)) ,data)));
	return 0;
}
http://zhidao.baidu.com/question/544661553?quesup2&oldq=1 还有这样也能解决问题,但这里看问题好像又不是出自于data.num,而是data1或data2 好郁闷啊
「已注销」 2013-04-26
  • 打赏
  • 举报
回复
引用 1 楼 hugett 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081#include<iostream>#incl……
谢谢你,按照你说的做后程序就对了,但不是很明白,能否麻烦你再跟我讲讲呢? “http://blog.csdn.net/sibylle/article/details/2026915中有下面这段话: 如果不对数组进行初始化,即在定义的同时没有用列表初始化,那么局部数组的值就取决于编译器而对程序员来说就是不可预料的了.有时间可以测试一下各个编译器,不过在vc中是0xcc.所以对局部数组的初始化要特别小心.但是全局的数组和静态数组还是会被正确的赋于0值的.” 是不是因为data1、data2在定义时都初始化了,没有被赋值的都会被赋于0值 而data没有初始化 只是将data[i]=data1[i]+data2[i],剩下的都没有置0,所以就像你说的“1+10, 会变成x1+10, 其中x是个随机数” 但这个随机数为什么在测试的数据中是有规律的呢,比如1会变成-9,2变成-8,3变成-7
hugett 2013-04-26
  • 打赏
  • 举报
回复

#include<iostream>
#include<string.h>
const int N=1000;
using namespace std;

typedef struct DATA{
	int num[1000];
	int len;
}DATA;

//翻转大数
DATA turnstr(DATA &data)
{
	int t;
	int midlen=data.len/2;
	int lastnum=data.len-1;
	for(int i=0;i<midlen;i++)
	{
		t=data.num[i];
		data.num[i]=data.num[lastnum];
		data.num[lastnum]=t;
		lastnum--;
	}
	return data;
}

//将输入的char型大数数组 转化 为int型大数数组
DATA chartoint(char *str,DATA &data)
{
	memset(data.num, 0, sizeof(data.num));//要把大于data.len的那些位置0。。
	data.len=strlen(str);
	for(int i=0;i<data.len;i++)
		data.num[i]=(int)str[i]-'0';
	return data;
}

//输出大数
void output(DATA data)
{
	for(int i=0;i<data.len;i++)
		cout<<data.num[i];
	cout<<endl;
}

//加法
DATA plus(DATA &data1,DATA &data2,DATA &data)
{
	int maxlen=(data1.len>=data2.len)?data1.len:data2.len;
	data.len=maxlen;                                  
	int add=0;
	for(int i=0;i<maxlen;i++)
	{
		//如果前边不置0,当长度不同时这里就会有问题。
		//例如1+10, 会变成x1+10, 其中x是个随机数, 所以出来的答案就错了。。
		data.num[i]=(data1.num[i]+data2.num[i]+add) %10;
		if(data1.num[i]+data2.num[i]+add >=10)
			add=1;
		else add=0;
	}

    if (add==1)   //加完最后一位还要进位的情况
	{
		data.len++;
		data.num[data.len-1]=1;
	}
	return data;
}

int main()
{
	char str1[N];
	char str2[N];
	DATA data1;
	DATA data2;
	DATA data;
	cout<<"请输入两个大数:"<<endl;
	gets(str1);
	gets(str2);
	output(turnstr( plus(turnstr(chartoint(str1,data1)),   turnstr(chartoint(str2,data2)) ,data)));
	return 0;
}

64,673

社区成员

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

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