找到只能被3,5和7整除的所有数字

时间:2015-02-26 13:30:30

标签: math division

我在接受采访时被要求找到所有数字只能被3,5和7整除。我的目的是我们可以像

那样进行检查
if (num%3==0 || num%5==0 || num%7==0) 
  return true 
else 
  return false. 

但是在这种情况下,如果我们有6,它将通过测试,但它也可以被2整除,所以这不起作用。你能说些什么吗? 我正在使用java。找到平均值以检查某个数字是否只能被此数字整除

3 个答案:

答案 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号码。