C++中的唯一数字

Ali*_*Ali 8 c++ algorithm math performance

我正在努力有效地列出1到100之间的数字.但是我必须摆脱相同数字的数字.
例: 12根据这个规则是相同的21 13是31 14是41所以for循环它不会翻过相同的数字.
我正在考虑一些技巧,例如从1到100获取所有数字,然后删除当前数字的找到的排列.我问这个的原因是因为像100000这样的大范围会失败. 另一个例子: 124等于142,241,214,412,421

Luk*_*hne 6

您可以申请递归.这个函数的原型就像:

print_digits(int num_of_remaining_digits,int start_from_digit, int current_number);
Run Code Online (Sandbox Code Playgroud)

编辑:为了完成,我在这里介绍我的解决方案(我认为它比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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这是测试代码

http://ideone.com/Xm8Mv

这是怎么回事?

它是递归中的经典之一.首先是停止状态.然后是主循环.
主循环从哪里开始,start_from_digit因为所有生成的数字将以非递减顺序.举例来说,如果current_number15 ,它会调用print_digits蒙山

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)
Run Code Online (Sandbox Code Playgroud)

在每个电话中,它将检查我们是否达到了结束白色num_of_remaining_digits,如果没有,将继续从被推送的数字start_from_digit(第二个参数)继续使用current_number