2012-01-08 13 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'から返す配列は決して解放されません。 –

+0

ヘッダー「」と「」(内容はまったく使用されていません)を含めると、このCコードとC++の唯一の関係になります...まあ、プレデクリメントもCの間に使用されます。 –

+0

個人的には、実際には2つの文字列の最大値になるように 'max'を修正することから始めます。 '(n1 [i] - '0') - (n2 [j] - '0')'は 'n1 [i] -n2 [j]'と同じであることに注意してください。 1つの明確な問題は、コードが最初の文字列を長く扱いますが、2番目の文字列は長くは処理しないことです。 –

答えて

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

gcc file.c -o file -lgmp –

+0

ありがとうございます(linuxで)コンパイルする必要があります。私はついにJavaに切り替えました... BigInteger –

+1

もちろん。スピードが必要な場合、GMPはBigIntegerよりもはるかに高速です。いくつかの事のためには数桁のオーダーが好きで、特に数字が大きくなるときはそうです。しかし、速度が重要でないものについては、Javaは素敵で簡単です。 –

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は動作しません。だから、これは私の唯一のオプションです –

+1

gmpは素晴らしいです。それはなぜ機能しないのですか? –

+2

GMPはあなたの大きな数字を処理できませんか?それは驚くべきことです!あなたはGMPを扱うことができますか? –

2

555-44が機能しないのは、 'if'ステートメントの場合と同じ条件を 'for'ステートメントでテストすることです。これは、一方の文字列が他方の文字列よりも長い場合、ループを早期に終了させます。

100から44までの理由でセグメント化エラーが発生するのは、定数文字列に書き戻そうとしているためです。

あなたのボローロジックも '0'からの借り入れを考慮していません。

関連する問題