我有一个间隔(m,n),必须打印出所有具有不同数字的数字。我写了这个,但是只适用于2位数字。我只是不知道如何使它只适用于2位数字。我想像一下,如果我为数字添加尽可能多的for循环,它将起作用,但是未指定interval(m,n),因此它必须可靠。我一直在尝试自己解决这个问题达6个小时,我绝对受够了。
输入97,113;
输出97,98,102,103,104,105,106,107,108,109
数字99,100,101,110+不会被打印,因为它们有2位数字
相同。
#include<conio.h>
#include<math.h>
#include<stdio.h>
int main()
{
int m,n,test,checker=0;
scanf("%d%d",&m,&n);
if(m>n)
{
int holder=n;
n=m;
m=holder;
}
for(int start=m;start<=n;start++)
{
int itemCount=floor(log10(abs(start)))+1;
int nums[itemCount];
int index=0;
test=start;
do
{
int nextVal = test % 10;
nums[index++]=nextVal;
test = test / 10;
}while(test>0);
for (int i = 0; i < itemCount - 1; i++)
{ // read comment by @nbro
for (int j = i + 1; j < itemCount; j++)
{
if (nums[i] == nums[j])
{
checker++;
}
}
if(checker==0)printf("%d ",start);
}
checker=0;
}
}
最佳答案
由于您将其标记为C ++,因此这是在循环中使用简单模数和除法的非常简单的解决方案。没有转换为字符串。
#include <iostream>
#include <bitset>
bool is_unique_digits(int num)
{
std::bitset<10> numset = 0;
while (num > 0)
{
// get last digit
int val = num % 10;
// if bit is on, then this digit is unique
if (numset[val])
return false;
// turn bit on and remove last digit from number
numset.set(val);
num /= 10;
}
return true;
}
int main()
{
for (int i = 97; i <= 113; ++i)
{
if (is_unique_digits(i))
std::cout << i << "\n";
}
}
is_unique_digit
函数简单地获取数字,并通过获取数字中的最后一位重复地从中提取数字。然后测试该数字以查看该位集中是否出现相同的数字。如果该数字已经存在,则会立即返回false
。如果该数字不在位集中,则将与该数字相对应的位“打开”,并将该数字除以10(有效地从该数字中删除最后一位数字)。如果循环完成,则返回
true
。Live Example
关于c++ - X元素数组中的重复项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41509997/