我在分配方面遇到了一些问题:从最右边的数字 1 中删除所有可以在左侧找到的数字

I have some problems with assignment: Remove all digits that can be found on the left from most right digit 1

提问人:Dmitry Finogenov 提问时间:11/13/2023 更新时间:11/13/2023 访问量:68

问:

我在大学里开始学习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;
}
C++ 循环 while-loop do-while

评论

0赞 lastchance 11/13/2023
setw() 和 setfill() 的组合应该可以解决这个问题。
0赞 Vlad from Moscow 11/13/2023
@Dmitry Finogenov 004 和 4 是相同的数字。似乎你只需要将 4 输出为 004。
1赞 Igor Tandetnik 11/13/2023
看起来作业希望您将数字视为字符串;否则,前导零没有意义。因此,只需将其转换为字符串,用于查找最右边的字符,然后从该位置向右打印后缀即可。find_last_of'1'
0赞 Pepijn Kramer 11/13/2023
@IgorTandetnik我也会使用它,但 OP 正在练习循环。但是,是的,使用 std::string 作为字符数组应该没问题。
1赞 Pepijn Kramer 11/13/2023
做一个循环,从字符串的最后一个字符开始,然后向后移动到前面。当你找到一个 1 时,你就知道字符串的其余部分在它的右边。(std::string 的 substr 在这里也很有用)

答:

0赞 Vlad from Moscow 11/13/2023 #1

004并且是 ame 编号。44

例如,如果您需要输出 as,请使用 manupulators 并在 header 中声明。4004std::setfillstd::setw<iomanip>

此外,您还应该将变量声明为具有无符号整数类型而不是类型。否则,您需要考虑数字的符号。numberint

这是一个演示程序,展示了如何使用机械手获得预期的结果。

#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
0赞 Jerry Coffin 11/13/2023 #2

虽然可以使用 和 的组合来完成这项工作,但在我看来,这几乎是一个伪装的数组——你基本上只是使用流的缓冲区作为数组来保存中间结果。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';
}

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