0

入力を文字列として受け取る電卓を作成するように依頼されました。これにより、長い数値を計算して結果も文字列にすることができます。加算部分を試しましたが、2 つの数値の長さが異なると機能しません。誰かが私のコードがどこで間違っていたのか、どうすれば修正できるのか教えてもらえますか? また、この原則を使用して分割する方法のアイデア。

i = strlen(first);
j = strlen(second);
x = 0;

while(1)
{
   z = (first[i-1] - 48) + (second[j-1] - 48) + carry;
   carry = z/10;
   result1[x] = z%10 + 48;

   x++;
   i--;
   j--;

   if(i==0 && j==0)
   {   if(carry!=0)
       result1[x] = carry + 48;
       break;
   }
}

 i = strlen(result1);

for (i = 0, j = strlen(result1)-1; i < j; i++, j--)
   {
     c = result1[i];
     result1[i] = result1[j];
     result1[j] = c;
   }

puts(result1);
4

2 に答える 2

2

各文字列の最下位桁から合計を開始する必要があります。合計が 9 を超える場合は、1 を次の上位桁の合計に繰り越します。紙の上と同じように。これはまた、各文字列 (数値) の長さを把握し、短い数値の前にある「暗黙のゼロ」を処理するように整理する必要があることも意味します。

于 2011-12-09T23:48:28.083 に答える
0
z = (first[i-1] - 48) + (second[j-1] - 48) + carry;

i または j のいずれかがゼロまたは負の場合、これは機能しません。両方の文字列が消費されるまでループを続けたい場合は、?: を使用して配列への安全でないアクセスを回避できます。ループの開始時に i と j をデクリメントする方が簡単な場合もあります。

if(i==0 && j==0)

i != j の場合、これは機能しません。ループを終了するより良い方法を見つける必要があります。(上記の慎重な条件付きロジックを使用すると、キャリーがゼロになるまでループを続行することもできます。)

于 2011-12-09T23:57:35.803 に答える