簡體   English   中英

將大數作為字符串處理

[英]Manipulating Big Numbers as strings

我遇到一個問題:

創建一個將大整數作為字符串輸入的C程序。
然后,每個字符都將轉換為相應的數字。

之后,我必須創建一個具有3個矩陣的函數addBigNumbers()

addBigNumbers(char *a1, char *a2, char *res)

a1a2將包含我要添加的2個大數, res將包含這些大數的和作為一個數字序列。 我們希望我們創建的函數檢查字符串是否僅包含數字。

如果僅包含數字,則res等於1,並打印這些數字的總和,否則res等於0(最大數字長度為1000

在第一個函數之后,我們要創建一個用於減法的函數。

到目前為止,自從我堅持參加第一個考試以來,我還沒有減法,我需要您的幫助。

這是我到目前為止的代碼:

#include <stdio.h>
#include <stdlib.h>
#define N 1000

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 int addHugeNumbers(char *a1, char *a2, char *res){
    int y=0, u=0, h=0;
    res=strcat(a1,a2);
    if(strlen(a1)>strlen(a2)){
        y=atoi(a1);
        u=atoi(a2);
        h=y+u;
     }
     else{
        y=atoi(a1);
        u=atoi(a2);
        h=u+y;
     }
     printf("%d", h);
 }

int main(int argc, char *argv[]) {
    char res[N];
    char a1[N/2];
    char a2[N/2];
    scanf("%s", &a1);
    scanf("%s", &a2);
    addHugeNumbers(a1, a2, res);


    return 0;
}

我的問題是,如果我輸入ex。 23 23輸出2346顯然是錯誤的,但它是46正確的,當我輸入1234 123時,它輸出1234246都是錯誤的。

奇怪的是,如果我輸入了1234r 123之類的內容或其中包含字符的其他內容,它將輸出准確的總和。

問題是res=strcat(a1,a2) ,它執行的操作與您所想的完全不同:它將a2附加到a1 ,並且不會“創建”新字符串。 參見例如cppreference.com上的 strcat -definition:

char * strcat(char * dest,const char * src)

將src指向的以空終止的字節字符串的副本追加到dest指向的以空終止的字節字符串的末尾。 字符src [0]替換dest末尾的空終止符。 產生的字節字符串以空值結尾。

因此,您需要在計算某些內容之前操縱輸入,這就是使用調試器時將要觀察的內容。

此外, scanf("%s", &a1)看起來可疑; 它應該是scanf("%s", a1); 您的編譯器應該已經警告過您。

您可能會重新考慮addBigNumbers ,可能是在循環中添加數字,而不是將它們轉換為(某種程度上總是)介於兩者之間的有限整數數據類型。 對於C語言的初學者來說,此任務實際上不算什么。 采取以下片段進行研究:

#define N 1000

int addHugeNumbers(char *a1, char *a2, char *res){

    char resultBuffer[N];
    int i1 = (int)strlen(a1);
    int i2 = (int)strlen(a2);
    int carryOver = 0;
    int ri = 0;
    while (i1 > 0 || i2 > 0) {  // until both inputs have been read to their beginning
        i1--;
        i2--;

        // read single digits and consider that a string might have already
        // been read to its beginning
        int d1 = i1 >= 0 ? a1[i1] - '0' : 0;
        int d2 = i2 >= 0 ? a2[i2] - '0' : 0;

        // check for invalid input
        if (d1 < 0 || d1 > 9 || d2 < 0 || d2 > 9) {
            return 0;
        }

        // calculate result digit, taking previous carryOver into account
        int digitSum = d1 + d2 + carryOver;
        carryOver = digitSum / 10;
        digitSum %= 10;

        resultBuffer[ri++] = digitSum + '0';
    }
    // write the last carryOver, if any
    if (carryOver > 0) {
        resultBuffer[ri++] = carryOver + '0';
    }

    // copy resultBuffer into res in reverse order:
    while(ri--) {
        *res++ = resultBuffer[ri];
    }
    // terminate res-string
    *res = '\0';

    return 1;
}

int main(int argc, char *argv[]) {
    char res[N];
    char a1[N/2] = "123412341234";
    char a2[N/2] = "1231";
    if (addHugeNumbers(a1, a2, res)) {
        printf("result: %s\n", res);
    } else {
        printf("invalid number.\n");
    }


    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM