仅在没有重复数字的情况下打印数字

时间:2012-02-05 22:32:57

标签: c++

我正在编写一个程序,它对打印的数字有一个输出要求,其中没有重复的整数

即。它不会打印122,161,998等 但它会打印任何其他数字,如123,345,742..etc

我该怎么做呢?谢谢!

6 个答案:

答案 0 :(得分:2)

我使用“位数组”来跟踪数字:这更像是一种“类似C”的解决方式......

int number_orig = ...,
    number = number_orig;
    bits = 0;
bool duplicate = false;
while (number != 0 && !duplicate)
{
 int digit = number % 10;
 if (bits & (1 << digit))
   duplicate = true;
 bits |= (1 << digit);
 number /= 10;
}
if (!duplicate)
  cout << number_orig;

答案 1 :(得分:1)

您可以创建std::set,循环显示数字,将它们添加到集合中,并查看数字的位数是否等于集合的大小。如果是,则不会重复数字。

如果您怀疑大多数号码不符合要求,您可以在每次插入后检查该数字是否实际已添加到该组中,如果不是,则立即拒绝该号码。

答案 2 :(得分:1)

C语言兼容的解决方案是将数字转换为字符串并保持数字的频率计数,如果存在重复,则返回true,例如:

int has_duplicate_digit(char * s) {
  char digit_count[10] = {0,0,0,0,0,0,0,0,0,0};
  for (int i=0; i<strlen(s); i++) {
    if ('0' <= s[i] && s[i] <= '9') {
      if (++digit_count[s[i]-'0'] > 1) return 1; // true
    }
  }
  return 0; // false
}

[编辑] 您还可以使用bitset而不是int数组来保存几个字节(可能还有一些时间)。例如:

#include <stdint.h>
int has_duplicate_digit2(char * s) {
  uint16_t digit_count = 0;
  for (int i=0; i<strlen(s); i++) {
    if ('0' <= s[i] && s[i] <= '9') {
      uint16_t bit = 1 << (s[i] - '0');
      if (digit_count & bit) return 1; // true
      digit_count |= bit;
    }
  }
  return 0; // false
}

答案 3 :(得分:1)

一个简单的基于字符串的解决方案:转换,排序,统一,计数:

#include <string>
#include <algorithm>
#include <iostream>

for (unsigned int i = 0; ; ++i)
{
    std::string sorig = std::to_string(i), suniq = sorig;
    std::sort(suniq.begin(), suniq.end());

    if (std::unique(suniq.begin(), suniq.end()) == suniq.end())
    {
        std::cout << sorig << std::endl;
    }
}

答案 4 :(得分:0)

只需将数字转换为字符串(itoa),就可以更轻松地解决核心任务。

答案 5 :(得分:0)

将数字转换为字符串,并设置代表1 << ( digit - '0' )的10位(全为零),然后您可以检查每个数字是否之前已经看过,如果是,则返回。否则设置那个位。