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刪除。



猜您在找 c0402_將兩個兩位數的正整數a、b合並為一個四位整數 leetcode給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,並且每個節點只能存儲 一位 數字 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 編程實現:對鍵盤輸入的任意一個四位正整數,計算各位數字平方和。 兩個大的正整數相加之和(C語言實現) 學習筆記-匯編-兩個16位數字相加獲得32位數字 給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM