UVa 10035 Primary Arithmetic

UVa 10035 Primary Arithmetic

本文关键字:Arithmetic Primary 10035 UVa      更新时间:2023-10-16

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

问题描述:

孩子们被教导从右到左每次加一个数位。许多人发现"进位"运算——将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;
}

你的代码至少有两个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()结束。

错误# 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.

这个测试用例呢:

5 5
11 0
99 999
0 0

?