如何在包含不同数字的范围内查找整数

时间:2012-11-10 18:51:29

标签: c++

  

可能重复:
  c++ program to find total numbers of integers containing different digits

假设我有一个无符号整数,将其称为低,另一个称之为高,使得高>低。问题是找到包含此范围内的不同数字的整数。例如,假设low为1而high为10则答案为10,因为此范围内的所有数字都包含不同的数字。如果假设low为1且high为12,则答案为10,因为11包含相同的数字。示例123,234,4567是有效数字但121,2342,4546是无效数字。我不是在寻找暴力算法。如果任何人都有一个更好的解决方案,然后通常的暴力方法,请告诉..

2 个答案:

答案 0 :(得分:0)

我会得到一个算法来确定0-n中这类数字的数量,然后你可以简单地计算(有效数字的数量为0-高) - (有效数字的数量为0-低)。要获得有效数字0-n,请查看数字中的位数:例如,如果n有5位数字,则每个有效的1,2,3和4位数字都在结果集中。因此,对于一个4位数字,您计算该4位数字中所有可能的数字组合:1234,1235,1236 ... 5678,5789和6789.然后计算排列数(1234也可以是1243, 1324,1342 ......等),并乘以(排列的数量)x(您在上一步中得到的不同序列的数量)。然后你得到所有4位数字的答案。为彼此集合做同样的事情,并为你的最后一集提出更具体的内容;如果高达5500,则需要5000-5100之间的有效数字。您可以应用类似的算法,但不是使用所有数字0-9,而是使用9个不同的数字,省略'5'。请注意,所有数字中也可以包含0,但不是在开头,因此算法也需要考虑到这一点。

答案 1 :(得分:0)

只需转换你的number to a string,然后在检查你的字符串中是否已经出现给定的字符时重复使用它。例如:

#include <string>

int main()
{
    std::string s = std::to_string(12345);
    bool occuredCheck[10] = {0}; //automatically fills with zeros. 10 values for the 10 numbers
    bool isValidNumber = true;

    for(int i=s.length()-1; i>=0; ++i)
        if(occuredCheck[s[i] - '0'] ^ true == 0) isValidNumber = false;
}

if-line set是数组条目为零,当diggit发生两次时,请参阅XOR。 并且isValidNumber会让您知道它实际上是否适合您。 顺便说一句:这个例子需要std::to_string的C ++ 11。

使用此算法,您可以检测到第一个无效数字,然后使用它设置范围。