求大神帮看此大数相加代码是否有问题

C语言 码拜 9年前 (2015-05-11) 836次浏览 0个评论
#include<stdio.h>
#include<string.h>
#define size 1001 
int main()
{
	char str1[size],str2[size],*num1,*num2,*p1,*p2;
	int ncase/*多组输入数目*/,mcase=1/*输出时的第几个输出计数器*/,up/*进位存储器*/,len1,len2,len;
	scanf("%d",&ncase);
	while(ncase--)
	{
		scanf("%s %s",str1,str2);
		printf("case %d:\n",mcase++);
		printf("%s + %s = ",str1,str2); 
		len1=strlen(str1);/*分别计算两数长度*/
		len2=strlen(str2);
		if( len1 >= len2 )/*把num1赋较大数的数组首地址num2赋较小数的数组首地址,且保证len1存长数组长度len2存短数组长度*/
		{
			num1=str1;
			num2=str2;
		}
		else
		{
			num1=str2;
			num2=str1;
			len=len1;
			len1=len2;
			len2=len;
		}
		up=0;/*进位赋初值0*/
		for(p1=num1+len1-1,p2=num2+len2-1;p1>=num1;p1--,p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/
		{
			if( p2 < num2 )/*当高位无数时补0*/
				*p2=48;
			*p1=*p1+*p2-96+up;/*由ascII码值化为十进制值*/
			up=0;
			if( *p1 >= 10 )/*如果此位相加结果十进制值大于10则作减10处理*/
			{
				*p1-=10;
				up=1;/*进位寄存器赋1*/
			}
			*p1+=48;/*再次化为ascII码以供输出*/
		}
		if( up == 1 )/*当最高位加上进位仍产生进位则需于前再输出一个“1”*/
			printf("1");
		printf("%s\n",num1);/*输出经加法处理改动的大数组*/
		if( ncase != 0 ) 
			printf("\n");
	}
	return 0;
}
40分
修改如下:

#include<stdio.h>
#include<string.h>
#define size 1001 
int main()
{
	char str1[size], str2[size], *num1, *num2, *p1, *p2;
	int ncase/*多组输入数目*/, mcase = 1/*输出时的第几个输出计数器*/, up/*进位存储器*/, len1, len2, len;
	scanf("%d", &ncase);
	while (ncase--)
	{
		scanf("%s %s", str1, str2);
		printf("case %d:\n", mcase++);
		printf("%s + %s = ", str1, str2);
		len1 = strlen(str1);/*分别计算两数长度*/
		len2 = strlen(str2);
		if (len1 >= len2)/*把num1赋较大数的数组首地址num2赋较小数的数组首地址,且保证len1存长数组长度len2存短数组长度*/
		{
			num1 = str1;
			num2 = str2;
		}
		else
		{
			num1 = str2;
			num2 = str1;
			len = len1;
			len1 = len2;
			len2 = len;
		}
		up = 0;/*进位赋初值0*/
		//for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p1 >= num1; p1--, p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/
		for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p2 >= num2; p1--, p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/
		{
			//if (p2 < num2)/*当高位无数时补0*/
			//	*p2 = 48;
			*p1 = *p1 + *p2 - 96 + up;/*由ascII码值化为十进制值*/
			up = 0;
			if (*p1 >= 10)/*如果此位相加结果十进制值大于10则作减10处理*/
			{
				*p1 -= 10;
				up = 1;/*进位寄存器赋1*/
			}
			*p1 += 48;/*再次化为ascII码以供输出*/
		}
		if (up == 1)/*当最高位加上进位仍产生进位则需于前再输出一个“1”*/
			//printf("1");
		{
			while (p1 >= num1)
			{
				*p1 += 1;
				if (*p1 > ""9"")
				{
					*p1 = ""0"";
					up = 1;
					p1--;
				}
				else break;   //无进位,直接跳出
			}
			if (p1 < num1) printf("1");
		}
		printf("%s\n", num1);/*输出经加法处理改动的大数组*/
		if (ncase != 0)
			printf("\n");
	}
	return 0;
}

求大神帮看此大数相加代码是否有问题

可是我的并没有什么不对啊
求大神帮看此大数相加代码是否有问题
楼主的代码中,随着p2不断减少,极有可能越过最小边界。
试一下,测试用例 999999999999999 + 9
然而事实证明我的16位的9加 上9结果还是对的    -_-||…
求大神帮看此大数相加代码是否有问题
仅供参考:

#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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求大神帮看此大数相加代码是否有问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!