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