UVa 10035主算术

时间:2013-06-11 10:01:58

标签: c++

有人可以告诉我为什么我的程序会得到错误的答案吗?它必须计算总和中的进位操作数。 我试过每一个测试包都出现在我的脑海里。我的输出没有错。

问题描述:

教导儿童一次从右到左添加多位数字。许多人发现“携带”操作 - 其中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;
}

2 个答案:

答案 0 :(得分:3)

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

Bug#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 + 1index_b + 1开始,以i < v1.size()i < v2.size()结束。

Bug#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.

答案 1 :(得分:0)

这个测试用例怎么样:

5 5
11 0
99 999
0 0