0

2 つの文字列がある場合:

a = "1234"
b = "4321"

次のように 2 つの数値を加算できます。

for(i=0; i<width-1; i++){
    sum = (a[width-2-i]-48) + (b[width-2-i]-48) + carry;
    carry = 0;
    if(sum > 9){
        carry = 1;
        sum-=10;
    }
    answer[i] = sum+48;
}

if(carry) answer[i++] = carry+48;
answer[i]= 0;

そしてそれを逆にします (幅は strlen(a) と同じです)。

次の場合、どうすれば同じことができますか?

a = "12345"
b = "4321"

メモリを再割り当てする必要がありますか? または何?

(ところで、私が解決しようとしている問題は、すべて50桁の多くの数字を使用しているため、私が理解しているように、strtoulまたはstrtoullは問題外です。これまでのコードは次のとおりです。)

4

5 に答える 5

1

どうしても「小学校足し算」を使う場合は、両方の紐の長さを求め、両端まで進み、短い方の紐の長さがなくなるまで戻します。次に、短い文字列の残りの桁がゼロであると仮定して、長い文字列だけを移動し続けます。

12345
04321

長い文字列の先頭までずっと移動し、そこでキャリーを処理する必要があります。いずれにせよ、新しい結果を割り当てる必要があることに注意してください。2N桁の数値を追加すると、桁上げのために 桁の数値になる可能性がN+1あるためです。

于 2013-05-21T01:27:52.337 に答える
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define c2d(c) (c-'0')
#define d2c(c) (c+'0')

char* add(const char *a, const char *b, char *ans){
    int alen, blen;
    int i, carry=0;
    char *wk;
    char *awk=strdup(a);
    char *bwk=strdup(b);

    alen=strlen(strrev(awk));
    blen=strlen(strrev(bwk));
    if(alen<blen){
        alen ^= blen;blen ^= alen;alen ^= blen;//swap
        wk = awk ; awk = bwk ; bwk = wk;
    }
    ans[alen+1]=ans[alen]='\0';
    for(i=0;i<alen;++i){
        int sum = c2d(awk[i])+(i<blen ? c2d(bwk[i]): 0)+carry;
        ans[i] = d2c(sum % 10);
        carry = sum / 10;
    }
    if(carry){
        ans[i++]='1';
    }
    free(awk);
    free(bwk);
    return strrev(ans);
}

int main(){
    const char *a="12345";
    const char *b="4321";
    char ans[6];

    printf("{%s}+{%s}={%s}\n", a, b, add(a,b, ans));
    return 0;
}
于 2013-05-21T09:33:26.407 に答える