2012-01-08 55 views
-1

減法我試圖實施減法方法,但得到了一些錯誤。C與char []

55-44正確 555-44是不正確的,它會返回011 100-44會導致段錯誤

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

char* subtract(char *n1,char *n2){ 
    int n1Len = strlen(n1); 
    int n2Len = strlen(n2); 


    int diff; 
    int max=n1Len; 
    char* res = (char*)malloc (max+2); 
    memset(res, '0', max +1); 

    res[max] = '\0'; 
    int i=n1Len - 1, j = n2Len - 1, k = max; 
    for (; i >= 0 && j >=0; --i, --j, --k) { 
     if(i >= 0 && j>=0) 
     { 
      diff = (n1[i] - '0') - (n2[j] - '0'); 
      if(diff<0) 
      { 
       int temp=n1[i-1]-'0'; 
       temp=temp-1; 
       n1[i-1]=temp+'0'; 
       diff+=10; 
      } 
      res[i]=diff+'0'; 
     } 
     else 
      res[i]=n1[i]; 

    } 
    return res; 
} 


int main(void) { 

    printf("%s\n", subtract("100","44")); 
} 
+4

附加一個調試器,逐步執行程序,並找出算法偏離正確行爲的位置。另外,請記住內存:從'subtract'分配並返回的數組永遠不會被釋放。 – 2012-01-08 04:31:04

+0

包含頭文件''和''(其內容根本沒有使用)它是C代碼與C++的唯一關係......那麼,在C中使用了predecrement的時候,它會使用postdecrement。 – 2012-01-08 04:32:07

+0

就個人而言,我會從修復'max'開始,確實是兩個字符串的最大值。雖然與你的問題無關,'(n1 [i] - '0') - (n2 [j] - '0')'與n1 [i] - n2 [j]'相同。一個明確的問題是,代碼處理的第一個字符串更長,但不是第二個字符串更長。 – 2012-01-08 04:36:38

回答

3

我在GMP中爲它踢了一腳。

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

char* subtract(char *n1,char *n2){ 
    mpz_t n1z, n2z; 
    char * res = malloc(strlen(n1) > strlen(n2) ? strlen(n1) + 1 : strlen(n2) + 1); 
    mpz_init_set_str(n1z, n1, 10); 
    mpz_init_set_str(n2z, n2, 10); 
    mpz_sub(n2z, n1z, n2z); 
    gmp_sprintf(res, "%Zd", n2z); 
    mpz_clear(n1z); 
    mpz_clear(n2z); 
    return res; 
} 

int main(void) { 
    printf("%s\n", subtract("55","44")); 
    printf("%s\n", subtract("555","44")); 
    printf("%s\n", subtract("100","44")); 
} 
+1

您需要編譯(在Linux中):gcc file.c -o file -lgmp – 2012-01-08 05:38:18

+0

非常感謝。我終於切換到Java ... BigInteger – 2012-01-08 05:50:10

+1

當然。如果你需要速度,GMP比BigInteger快很多。就某些事情而言,就像幾個數量級一樣,特別是當數字變大時。但是,有時候Java很好,很容易,對於速度無關緊要的東西。 – 2012-01-08 05:55:52

0

如何只

int i1 = atoi(n1); 
int i2 = atoi(n2); 
int result = i1 - i2; 
char * retval = malloc(2*strlen(n1)); // Easier than figuring out exact right size! 
sprintf(retval, "%d", result); 
return retval; 

這樣不是好多了?

+1

謝謝。但我不能那樣做。我正在處理非常大的數字,gmp不起作用。所以,這是我唯一的選擇 – 2012-01-08 04:34:26

+1

gmp真棒。爲什麼它不起作用? – 2012-01-08 04:40:50

+2

GMP無法處理您的大數字?這是令人驚訝的!你確定你可以處理GMP嗎? – 2012-01-08 04:53:36

2

555-44不起作用的原因是您在'for'語句中測試的條件與'if'語句中的條件相同。如果一個字符串比另一個字符串長,則會導致循環提前退出。

原因100-44導致分段錯誤的原因是您正試圖回寫一個常量字符串。

您的借貸邏輯也不會從'0'借入帳戶。