-1

私のプログラムが間違った答えを出し続ける理由を誰か教えてもらえますか? 合計でキャリー操作の数をカウントする必要があります。頭に浮かんだすべてのテストケースを試しました。間違った出力は得られませんでした。

問題の説明:

子供たちは、複数の数字を右から左に 1 桁ずつ足すように教えられます。多くの人は、1 をある桁から次の桁に追加する「桁上げ」操作が重要な課題であると感じています。あなたの仕事は、教育者がその難易度を評価できるように、足し算の問題のセットごとにキャリー操作の回数を数えることです。

入力

入力の各行には、10 桁未満の符号なし整数が 2 つ含まれています。入力の最後の行には 0 0 が含まれます。

出力

最後の行を除く各入力行について、2 つの数値を加算した結果のキャリー操作の数を計算して、以下に示す形式で出力する必要があります。

サンプル入力

123 456
555 555
123 594
0 0

サンプル出力

No carry operation.
3 carry operations.
1 carry operation.

これが私の現在のコードです:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

unsigned long a, b, carry;
vector <int> v1, v2;
int index_a, index_b;

void digit(unsigned long x, unsigned long y)
{
    for(int i=x; i>0; i/=10)
        v1.push_back(i%10);
    for(int i=y; i>0; i/=10)
        v2.push_back(i%10);
}

int main()
{
    while(cin>>a>>b && a!=0 && b!=0)
    {
        v1.clear();
        v2.clear();
        int carry_counter=0;
        digit(a, b);

        for(int j=0; j<v1.size() && j<v2.size(); j++)
        {
            carry=(v1[j]+v2[j]+carry)/10;
            if(carry)
                carry_counter++;
            index_a=index_b=j;
        }

        for(int i=index_a; i+1<v1.size(); i++)
        {
            carry=(v1[i]+carry)/10; 
            if(carry)
                carry_counter++;
        }

        for(int i=index_b; i+1<v2.size(); i++)
        {
            carry=(v2[i]+carry)/10;
            if(carry)
                carry_counter++;
        }

        if(carry_counter==1)
            cout<<"1 carry operation."<<endl;
        else if(carry_counter>1)
            cout<<carry_counter<<" carry operations."<<endl;
        else
            cout<<"No carry operation."<<endl;
    }
    return 0;
}
4

2 に答える 2

3

あなたのコードには少なくとも 2 つのバグがあります。

バグ #1

これはあなたが失敗しているテストケースです

989 1
0 0

あなたのコードは、1 つしかないのに 2 つのキャリー操作があると答えます。問題 (実際には、問題の 1 つ) は次の行にあります。

for(int i=index_a; i+1<v1.size(); i++)
for(int i=index_b; i+1<v2.size(); i++)

これらは and から始まり、index_a + 1andindex_b + 1で終わる必要がi < v1.size()ありi < v2.size()ます。

バグ #2

そして、あなたはすべての入力を読んでいるわけではありません! 主なループ条件は次のとおりです。

while (cin>>a>>b && (a!=0 || b!=0))

テスト ケース、期待される出力、および受け取った出力

より明確にするために、ここにテストケースがあります:

989 1
1 989
11 0
0 11
2 3
2234 766
0 0

そして、予想される(正しい)出力は次のとおりです。

1 carry operation.
1 carry operation.
No carry operation.
No carry operation.
No carry operation.
3 carry operations.

しかし、あなたのコードは次の出力を提供します (これは明らかに間違っています):

2 carry operations.
2 carry operations.
于 2013-06-11T10:22:17.990 に答える
0

このテストケースはどうですか:

5 5
11 0
99 999
0 0

?

于 2013-06-11T10:22:04.883 に答える