-4

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

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

输入示例:对于除最后一行之外的每一行输入,计算将两个数字相加产生的进位运算的数量,并以如下所示的格式打印它们。

这是满足小于 10 位输入的原始代码

#include <iostream>
#include <cstdio>
#include <cstdlib>

int main(void){
unsigned int n1, n2, remain_n1, remain_n2, carry;

while(1)
{
    std::cin >> n1 >> n2;

    if(n1 == 0 && n2 == 0)
        break;

    int carry = 0;
    int count = 0;
    int sum = 0;

    while(n1 != 0 || n2 != 0)
    {
        remain_n1 = n1 % 10;        
        remain_n2 = n2 % 10;         

        if(carry == 1)             
            remain_n1++;          


        sum = remain_n1 + remain_n2;       
        carry = 0;

        if(sum >= 10){                     
            carry = carry + 1;                         
            count = count + 1;                       
        }

        n1 = n1 / 10;                          
        n2 = n2 / 10;                              

    }

    if(count == 0)
        std::cout << "No carry operation." << std::endl;
    else if(count == 1)
        std::cout << count << " " << "carry operation" << std::endl;
    else
        std::cout << count << " " << "carry operations" << std::endl;
}
return 0;
}

问题输入说少于 10 位,但我想更改以满足任何输入的条件。这是我的代码。我应该如何解决这个问题?

 std:;string n1, n2;
 while(1){
 std:;cint >> n1 >> n2;
 if(n1 == "0" && n2 == "0")
       break;

 int max_len = n1.szie();
 if (max_len < n2.size())
     max_len = n2.size();

 int nn1[max_len] - {0);
 int nn2[max_len] = {0};

 for(int i = 0; i < n1.size(); i++)
       nn1[max_len - n1.size() + i]; = n1[i] - '0'; 
 }
4

1 回答 1

1

您不需要任何额外的数字存储空间,您可以直接使用字符串的数字并随时转换。

像这样的东西,也许:

std::cin >> a >> b;

int carry = 0;
int count = 0;

// Iterate in reverse.
for (auto ia = a.rbegin(), ib = b.rbegin(); ia != a.rend() && ib != b.rend(); ++ia, ++ib)
{
    int sum = (*ia - '0') + (*ib - '0') + carry;
    carry = sum >= 10;
    count += carry;
}
于 2020-04-23T12:20:44.783 回答