我在接受采访时被要求找到所有数字只能被3,5和7整除。我的目的是我们可以像
那样进行检查if (num%3==0 || num%5==0 || num%7==0)
return true
else
return false.
但是在这种情况下,如果我们有6,它将通过测试,但它也可以被2整除,所以这不起作用。你能说些什么吗? 我正在使用java。找到平均值以检查某个数字是否只能被此数字整除
答案 0 :(得分:4)
我会通过从原始数字中删除3,5和7中的所有因子,并查看剩下的内容来解决此问题。
while(num % 3 == 0)
{
num = num / 3;
}
while(num % 5 == 0)
{
num = num / 5;
}
while(num % 7 == 0)
{
num = num / 7;
}
return (num == 1);
答案 1 :(得分:2)
我不会给你一个Java算法,因为它应该很容易实现。
你可以:
1. check if (n%3 == 0)
2. if it is, set n /= 3 and repeat step 1.
3. do the same for the number 5 and 7
4. now if n != 1, return false, else return true
在Java算法中:
// n is some random natural number
if (n == 1 || n == 0)
return false
while (!n%3)
{
n /= 3;
}
while (!n%5)
{
n /= 5;
}
while (!n%7)
{
n /= 7;
}
if (n == 1)
{
return true;
}
else
{
return false;
}
这不是最好的语法,我只是直接实现上面提到的算法。
答案 2 :(得分:2)
我们首先注意到1是该集合的成员。虽然它不能被3,5或7整除,但它也不能被除3,5或7之外的任何数字整除,所以我们会说1在集合中。这符合集合的数学定义{ x = 3 i ·5 j ·7 k | i , j , k ≥0}。
一种方法是从1开始计数,在每一步加2,并检查数字是否只能被3,5和7整除。这很慢,因为它会做很多工作立即被丢弃,因为有很多较少的数字只能被3,5和7整除,而不是奇数。
更好的方法是通过归纳直接生成所需的数字。数字1在集合中,对于集合中的任何 x ,3 x ,5 x 和7 x 。因此,生成所有数字的算法按顺序仅由3,5和7整除:
1. Initialize a priority queue with the number 1.
2. Pop the smallest number in the priority queue, call it x.
3. Add 3x, 5x and 7x to the priority queue.
4. Output x as the next integer in the set.
5. If you want more output, go to Step 2.
6. Halt.
我实现了两种算法;你可以在 http://ideone.com/YwnAQ8看到它们。蛮力方法需要花费十多秒才能找到3,5,7集中的203名成员不到一百万;优先级队列在百分之一秒内完成相同的计算,快一千倍。在my blog解释了那里使用的优先级队列实现。您还可以在OEIS处看到3,5,7号码。