我正在编写一个程序,它对打印的数字有一个输出要求,其中没有重复的整数
即。它不会打印122,161,998等 但它会打印任何其他数字,如123,345,742..etc
我该怎么做呢?谢谢!
答案 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位(全为零),然后您可以检查每个数字是否之前已经看过,如果是,则返回。否则设置那个位。