<分区>
我试图有效地列出 1 到 100 之间的数字。但是我必须去掉具有相同数字的数字。
例子:
根据此规则,12 与 21 相同
13 等于 31
14 等于 41
所以 for 循环不会遍历相同的数字。
我在想一些技巧,例如获取从 1 到 100 的所有数字,然后删除找到的当前数字排列。
我问这个的原因是因为在 100000 这样的大范围内它会失败。
另一个例子:124等于142,241,214,412,421
<分区>
我试图有效地列出 1 到 100 之间的数字。但是我必须去掉具有相同数字的数字。
例子:
根据此规则,12 与 21 相同
13 等于 31
14 等于 41
所以 for 循环不会遍历相同的数字。
我在想一些技巧,例如获取从 1 到 100 的所有数字,然后删除找到的当前数字排列。
我问这个的原因是因为在 100000 这样的大范围内它会失败。
另一个例子:124等于142,241,214,412,421
最佳答案
您可以应用递归。这个函数的原型(prototype)是这样的:
print_digits(int num_of_remaining_digits,int start_from_digit, int current_number);
编辑:为了完成,我在这里展示我的解决方案(我认为它比 Ben Voigt 和升序输出顺序具有更好的可读性
void print_digits(int num_of_remaining_digits,int start_from_digit, int current_number)
{
if(num_of_remaining_digits == 0)
{
std::cout << current_number << std::endl;
return;
}
for(int i=start_from_digit;i<=9;i++)
{
print_digits(num_of_remaining_digits-1,i,10*current_number+i);
}
}
这是测试代码
这是如何运作的?
它是递归中的经典之一。首先是停止条件。然后是主循环。
主循环从 start_from_digit
开始,因为所有生成的数字都将按非递减顺序排列。例如,如果 current_number
是 15
,它将调用 print_digits
whith
print_digits(num_of_remaining_digits-1,5,155)
print_digits(num_of_remaining_digits-1,6,156)
print_digits(num_of_remaining_digits-1,7,157)
print_digits(num_of_remaining_digits-1,8,158)
print_digits(num_of_remaining_digits-1,9,159)
在每次调用中,它都会检查我们是否到达了 num_of_remaining_digits
的结尾,如果没有,它将使用 current_number 从被推送为
start_from_digit
(第二个参数)的数字继续
关于c++ - C++ 中的唯一数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056633/