-1

谁能告诉我为什么我的程序总是得到错误的答案?它必须计算进位操作的总数。我尝试了每一个测试用例。我没有得到错误的输出。

问题描述:

孩子们被教导从右到左一次添加多位数字。许多人发现“进位”操作(即从一个数字位置携带 1 以添加到下一个数字位置)是一项重大挑战。你的工作是计算每组加法问题的进位操作次数,以便教育工作者评估他们的难度。

输入

每行输入包含两个小于 10 位的无符号整数。输入的最后一行包含 0 0。

输出

对于除最后一行之外的每一行输入,您应该计算并打印两个数字相加所产生的进位操作数,格式如下所示。

样本输入

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

您的代码至少有两个错误。

错误 #1

这是您失败的测试用例

989 1
0 0

您的代码回答有 2 个进位操作,而只有一个。问题(实际上是问题之一)在于以下几行:

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

这些应该从index_a + 1and开始并以andindex_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 回答