簡體   English   中英

可以在C中添加非常大的數字,但不能少的數字

[英]Can add very large numbers but not small numbers in C

我有一個可以添加大數的C程序,它可以正常工作,但是我也需要添加小數,但是我得到的輸出是奇數,並且不確定錯誤來自何處。

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

int main() {
int num1[255], num2[255], sum[255], m = 0, z, x = 0;
char s1[255], s2[255], in[255];
int l1, l2;

printf("enter the input as a+b=\n");
scanf("%s", in);
for (z = 0; in[z] != '+'; z++) {
    s1[z] = in[z];
    m++;
}

for (z = m + 1; z < strlen(in) - 1; z++) {
    s2[x] = in[z];
    x++;
}

for (l1 = 0; s1[l1] != '\0'; l1++)
    num1[l1] = s1[l1] - '0';
for (l2 = 0; s2[l2] != '\0'; l2++)
    num2[l2] = s2[l2] - '0';

int carry = 0;
int k = 0;
int i = l1 - 1;
int j = l2 - 1;

for (; i >= 0 && j >= 0; i--, j--, k++) {
    sum[k] = (num1[i] + num2[j] + carry) % 10;
    carry = (num1[i] + num2[j] + carry) / 10;
}

if (l1 > l2) {
    while (i >= 0) {
        sum[k++] = (num1[i] + carry) % 10;
        carry = (num1[i--] + carry) / 10;
    }

    if (carry != 0) {
        sum[k] = carry;
        k = k + 1;
    }
} else if (l1 < l2) {
    while (j >= 0) {
        sum[k++] = (num2[j] + carry) % 10;
        carry = (num2[j--] + carry) / 10;
    }

    if (carry != 0) {
        sum[k] = carry;
        k = k + 1;
    }
} else {

    if (carry > 0)
        sum[k++] = carry;
}

printf("%s+%s=\n", s1, s2);

for (k--; k >= 0; k--)
    printf("%d", sum[k]);
return 0;
}

如果輸入以下值:

輸入輸入為a + b =

9999999999999999999999999999 + 1 =

我得到的輸出就是我想要的

9999999999999999999999999999 + 1 =

10000000000000000000000000000

當我嘗試較小的東西時:

123 + 456 =

輸出不同

123ó+ 456 =

16-5-6

我不知道這些數字從何而來,並且任何小於99999999999999999999999999999999 + 1的數字都會不斷出現,它應該適用於任何數字,而不僅僅是一個數字。

for (l1 = 0; s1[l1] != '\0'; l1++)
//           ^^^^^^^^^^^^^^

這是一個問題:您正在s1檢查'\\0' ,但從未將s1任何元素設置為'\\0' ,因此這將訪問未初始化的內存並可能超出數組的范圍。

您對s2有同樣的問題。

可能還有其他問題,但這是我停止閱讀的地方。


普通的留言:

  • 切勿使用scanf
  • 如果這樣做,請始終檢查其返回值以確保成功。
  • 切勿將%sscanf 這是等待發生的緩沖區溢出。
  • 您的代碼對輸入的外觀進行了非常嚴格的假設。 如果用戶未正確輸入您的代碼所期望的內容,則會發生有趣的事情(例如,第一個for (z = 0; in[z] != '+'; z++)循環將超出范圍。字符串中的+ )。 您可能應該驗證您的假設,而不是盲目地假設一切正常。

暫無
暫無

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

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