c0605_两个超长正整数(每个最长80位数字)的加法运算


【问题描述】
编写程序实现两个超长正整数(每个最长80位数字)的加法运算。
【输入形式】
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
1. 第一行是超长正整数A;
2. 第二行是超长正整数B;
【输出形式】
输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。
算法提示:
1.用字符串输入两个超长整数,分别存放在两个字符串中,每一位对应一个字符串中的字符。
2.以较短的超长整数为基准,从低位到高位,对应位转换成数字后相加,再加上前一位相加的进位,得到的和模上10再转换为字符即为当前位,得到的和整除10即为当前位的进位。将计算得到的每一位保存到结果字符数组。
3.将较长字符串的剩余位加上最后一个进位移到结构数组后面。
4.将结果数组反序输出(去掉高位多余的0)。
【输入样例】
134098703578230056
234098
【输出样例】
134098703578464154
【样例说明】
进行两个正整数加法运算,134098703578230056 + 234098 = 134098703578464154。
【评分标准】
完全正确得20分,每个测试点4分,提交程序文件名为add.c。

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

个人代码:

#include <stdio.h>
#include <string.h>

int jinwei = 0;

int invert(char *s){
    int i=0,j,l;
    char temp;
    l = strlen(s);
    j = l-1;
    while(s[i]=='0'){
        l--;
        s[i] = s[j];
        s[j] = '\0';
        i++;
        j--;
    }
    for(;j>i;i++,j--){
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }
    return l;
}

char add(int a, int b){
    int temp;
    temp = (a+b)%10+jinwei;
    jinwei = (a+b)/10;
    if(temp==10){
        temp = 0;
        jinwei++;
    }
    return temp+'0';
}

int main(){
    char a[128],b[128],res[128]={'0'};
    int la,lb,i,lres;
    gets(a);
    gets(b);
    la = invert(a);
    lb = invert(b);
    for(i=0;i<la&&i<lb;i++){
        res[i] = add(a[i]-'0',b[i]-'0');
    }
    if(la<lb){
        for(;b[i]!='\0';i++){
            res[i] = add(0,b[i]-'0');
        }
    }
    else{
        for(;a[i]!='\0';i++){
            res[i] = add(a[i]-'0',0);
        }
    }
    if(jinwei==1)
        res[i++] = '1';
    res[i] = '\0';
    lres = strlen(res);
    for(i=lres-1;i>=0;i--)
        printf("%c",res[i]);
    printf("\n");
    getchar();
    return 0;
}

标答:

#include <stdio.h>
#include <string.h>

main()
{
    char a[128], b[128], r[128] = "00000000000000";
    char *longer, *shorter;
    static int temp = 0;
    int i, j, lengthOfLonger, lengthOfShorter;

    scanf("%s %s", a, b);
    if (strlen(a) > strlen(b)) {
        longer = a;
        shorter = b;
    } else {
        longer = b;
        shorter = a;
    }
    lengthOfLonger = strlen(longer);
    lengthOfShorter = strlen(shorter);

    for (i = lengthOfShorter - 1, j = lengthOfLonger - 1; i >= 0; i--, j--) {    
        r[j+1] = longer[j] + shorter[i] - '0' + temp;
        if (r[j+1] > '9') {
            r[j+1] -= 10;
            temp = 1;
        } else {
            temp = 0;
        }
    }
    for (; j >= 0; j--) {
        r[j+1] = longer[j] + temp;
        if (r[j+1] > '9') {
            r[j+1] -= 10;
            temp = 1;
        } else {
            temp = 0;
        }
    }
    r[j + 1] = temp + '0';
    for (i = 0; r[i] == '0'; i++) {
        ;
    }
    for (; i < lengthOfLonger + 1; i++) {
        printf("%c", r[i]);
    }
    printf("\n");
}

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

1、对于两个数组a[]、b[],若需要区分长短,可以定义两个指针 *longer、*shorter,若 a[] 较长,则 longer = a,那么 a[] 就是 longer[],用这种方法来简化代码。

    char a[128], b[128];
    char *longer, *shorter;
    int lengthOfLonger, lengthOfShorter;

    scanf("%s %s", a, b);
    if (strlen(a) > strlen(b)) {
        longer = a;
        shorter = b;
    } else {
        longer = b;
        shorter = a;
    }
    lengthOfLonger = strlen(longer);
    lengthOfShorter = strlen(shorter);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2026 CODEPRJ.COM