qq_40920768
Stukang
采纳率100%
2019-11-17 20:07 阅读 1.2k

C语言实现大数加法(正整数)

杭电OJ1002
输入:输入的第一行包含一个整数T(1<=T<=20),表示测试用例的数量。接下来是T行,每行由两个正整数A和B组成。注意,整数非常大,这意味着您不应该使用32位整数来处理它们。您可以假设每个整数的长度不超过1000。
输出:对于每个测试用例,您应该输出两行。第一行是“Case”,表示测试用例的编号。第二行是方程“A+B=Sum”,Sum表示A+B的结果。注意方程中有一些空格。在两个测试用例之间输出一个空行。

我拿很多种数进行了测试,在VS上都没问题。但是提交就是WRONG..wrong了一天了。下面是代码,各位前辈帮帮忙,给看看。

#include<stdio.h>
#include<string.h>
#define MAX(a,b) a>b?a:b
int main() {
    int n = 0,i,j,num=0,lengh,lengh_a1,lengh_a2,flag;
    char a1[1002], a2[1002];//字符数组存大数
    scanf("%d", &n);
    for (j = 0; j < n; j++) {
        scanf("%s%s", &a1, &a2);
        lengh_a1 = strlen(a1);//读输入到两个字符数组中的元素个数,用于转换成整形数组
        lengh_a2 = strlen(a2);
        int c1[1002] = { 0 }, c2[1002] = { 0 }, c3[1003] = { 0 };//定义在循环内部,每次都会初始化一次(在外面好像也没遇到错误)
        for (i = 0; i < lengh_a1; i++) {
            c1[i] = a1[lengh_a1 - i - 1]-48;//倒着把字符数组的元素输入到整形数组中
        }
        for (i = 0; i < lengh_a2; i++) {
            c2[i] = a2[lengh_a2 - i - 1]-48;
        }
        lengh = MAX(lengh_a1, lengh_a2);//两数组最长的长度
        for (i = 0; i <lengh; i++) {
            flag = 0;//用来看最后一次循环是否进位,在输出的时候用到了
            c3[i] = c1[i] + c2[i]+ num;//如果进位,加num
            num = 0;
            if (c3[i] >= 10) {
                c3[i + 1] = 1;//进位,因为这层循环到c3[lengh-1]为止,这样写使c3[lengh]可以获得到进位。
                num = 1;
                c3[i] -= 10;
                flag = 1;
            }
        }
        num = 0;//防止上一组数的进位Num影响到下一组数
        printf("case%d:\n",j+1);//输出
        printf("%s + %s = ", a1, a2);
        for (i = lengh + flag -1; i >= 0; i--)
            printf("%d", c3[i]);
        if (j + 1 != n) printf("\n\n");
        else printf("\n");
    }
    return 0;
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    chenxizhan1995 chenxizhan1995 2019-11-19 03:04

    是不是输出格式不对,Case首字母大写?

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2019-11-17 21:49
    每个整数的长度不超过1000
    x20,需要多2位
    再加上\0
    你试试看1003
    
    点赞 1 评论 复制链接分享

相关推荐