2014-03-26 32 views
0

我想添加兩個大整數作爲輸入字符串由用戶。當兩個輸入字符串的長度不同時,我嘗試用零填充較短的數字,但它不工作。所以如果我輸入456和7,它會在前面加上一些隨機字符。 感謝您的任何建議!在大int中的進位數/填充在C中

void reverse(char *start, char *end) 
    { 
     int l ; 
     int len = strlen(start); 
     for (l=0;l<len;l++) 
      end[l] = start[len-l-1]; 
     end[len] = '\0'; 

    } 

    void add (char *x, char *y, char *sum) 
    { 
     char XA[MAXDIGITS]; 
     char YA[MAXDIGITS]; 
     char tempa[MAXDIGITS]; 
     int xa_len, ya_len, xa1, ya1, carry, addition, p, q; 
     int m = 0; 
     int n = -1; 
     xa_len=strlen(x); 
     ya_len=strlen(y); 
     reverse(x,XA); 
     reverse(y,YA); 
     m = (xa_len > ya_len)?xa_len:ya_len; 
     for(xa1=0;xa1<=m;xa1++) 
      tempa[xa1] = '0'; 
     tempa[xa1] = '\0'; 
     if(xa_len>ya_len) 
     { 
      for(p=(xa_len-ya_len);p=<m;p++) YA[p]='0'; 
      YA[p] = '\0'; 
     } 
     if(ya_len>xa_len) 
     { 
      for(q=(xa_len-ya_len);q=<m;q++) XA[q]='0'; 
      XA[p] = '\0'; 
     } 
     for(xa1=0;xa1<=m;xa1++) 
     { 
      addition=(XA[xa1]-'0')+(YA[xa1]-'0')+carry; 
      tempa[xa1] = addition%10+'0'; 
      carry = addition/10; 
      if (n<xa1) n=xa1;       
     }  
     printf("%d", carry);  
     for(;n>0 && tempa[n]=='0';n--) 
     tempa[n+1]='\0'; 
      reverse(tempa,sum); 
    } 

這是我如何打印我的輸出

add (x,y,addition); 
     int length=(strlen(addition)); 
     printf("Sum is "); 
     for(k=0;k<length;k++) printf("%c",addition[k]); 
+1

我可以看到幾個地方,你使用'carry',但是我沒有看到任何你給'carry'的初始值。我建議您編譯時將警告設置爲最大值。這是'-Wall'在微軟上的unix和IIRC'-W4'。 – user3386109

+0

你可能想用它作爲參考。 https://github.com/arunmoezhi/BigNumArithmetic – arunmoezhi

回答

0

當然carry必須初始化。

無法跟蹤您的代碼。撥打reverse()可以通過簡單地沿相反方向運行循環來完成。此外,最終的結果似乎並不影響結果。建議的代碼如下:

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

char *str_add(const char *a, const char *b) { 
    size_t alen = a == NULL ? 0 : strlen(a); 
    size_t blen = b == NULL ? 0 : strlen(b); 
    if (blen > alen) { 
    const char *t = a; a = b; b = t; 
    size_t tlen = alen; alen = blen; blen = tlen; 
    } 
    size_t clen = blen + 1; 
    int carry = 0; 
    char *c = malloc(clen + 1); // 1 extra 
    const char *ap = &a[alen]; 
    const char *bp = &b[blen]; 
    char *cp = &c[clen]; 
    *cp = '\0'; 
    while (bp > b) { 
    int sum = *(--ap) - '0' + *(--bp) - '0' + carry; 
    carry = 0; 
    if (sum >= 10) { 
     sum -= 10; 
     carry++; 
    } 
    *(--cp) = sum + '0'; 
    } 
    while (ap > a) { 
    int sum = *(--ap) - '0' + carry; 
    carry = 0; 
    if (sum >= 10) { 
     sum -= 10; 
     carry++; 
    } 
    *(--cp) = sum + '0'; 
    } 
    if (carry) { 
    memmove(&cp[1], &cp[0], clen); 
    *cp = carry + '0'; 
    } 
    return cp; 
} 

void test_add(const char *a, const char *b) { 
    char *sum = str_add(a,b); 
    printf("%s + %s = %s\n", a, b, sum); 
    free(sum); 
}