c++ 我在赋值时遇到了一些问题:从最右边的数字1中删除所有可以在左边找到的数字

b0zn9rqh  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(89)

我在Uni开始了C++。现在我们使用循环。我有实际的任务:任务: 输入:整数。从最右边的数字1中删除所有可以在左边找到的数字。
举例来说,您可以:

  • 输入:314195
  • 结果:95

或者:

  • 输入45131005
  • 结果:005

对于这个任务,我们不能使用数组或字符串。但是我们仍然可以使用数学函数。此外,必须有强制性的while/do while条件。
我已经写了代码,使用%和/查找第一个数字1之前的值。然而,结果它不能正常工作,当我输入431004时-它只显示4,而不是004。下面是我的代码:

#include <iostream>
using namespace std;
int main()
{
int number; 
cout << endl << "Enter integer number: ";
cin >> number;

int result;
int buffer = 0;
int divider = 10;
int check = 1;

do {
    result = buffer;
    buffer = number % divider;
    divider = divider * 10;
    check *= 10;
} while ((buffer / (check / 10)) != 1);

cout << endl << "Result = " << result; 

return 0;
}

字符串

xmq68pz9

xmq68pz91#

0044是相同的数字4
例如,如果您需要将4输出为004,则使用在头文件<iomanip>中声明的manupulators std::setfillstd::setw
另外,你应该将变量number声明为一个无符号整数类型,而不是int类型。否则你需要考虑数字的符号。
这里是一个演示程序,展示了如何使用操纵器获得预期的结果。

#include <iostream>
#include <iomanip>

int main()
{
    const unsigned int Base = 10;

    unsigned long long int number;
    
    std::cout << "Enter a non-negative integer number: ";

    if (std::cin >> number)
    {
        unsigned long long int result = 0;
        unsigned long long int multiplier = 1;

        int n = 0;

        while ( number && number % Base != 1 )
        {
            result += ( number % Base ) * multiplier;
            ++n;
            multiplier *= Base;
            number /= Base;
        }

        std::cout << "Result = " 
            << std::setw( n ) << std::setfill( '0' ) << result << std::endl;
    }
}

字符串
程序输出可能类似于

Enter a non-negative integer number: 431004
Result = 004

1zmg4dgp

1zmg4dgp2#

虽然可以使用std::setwstd::setfill的组合来完成这项工作,但我觉得这几乎是一个伪装的数组--基本上只是使用流的缓冲区作为数组来保存中间结果。
如果你想避免这种情况,你可以做一些不同的事情。举个例子:

#include <iostream>

void cvt(int input) { 
    if ((input != 0) && ((input % 10) != 1)) {
        cvt(input / 10);
        std::cout.put('0' + input % 10);
    }
}

int main() { 
    cvt(45131005);
    std::cout << '\n';
}

字符串
正如预期的那样,结果是:005--而且(尽管缺少缓冲会使它有点慢)这并不依赖于系统的其他部分能够做任何比将字符写入标准输出更多的事情。作为奖励,它实际上比(大多数)使用std::setwstd::setfill的代码更短更简单。

相关问题