找到大多数除数的数字的最快方法

时间:2016-07-26 17:18:39

标签: algorithm performance time

给定一个数n可以找到具有大多数因子的最小数字并且小于n?的速度 PS:除了找到所有数字最多n的除数的天真方法之外。

更新:我的观察:

int solve(int primes[],int s,int n)
{
    int i=0;
    while(s<n)
    {
        s*=primes[i];
        i++;
    }
    if(s>n)
        s/=primes[i-1];
    return s;
}
int main()
{
    int primes[] = {2,3,5,7,11,13,17,19,23,29,31,37};
    int n;
    scanf("%d",&n);
    int s=1;
    while(s*2<n)//checking the possibility of existence of any prime such that s*p<n
    {
        s=solve(primes,s,n);
    }
    printf("%d\n",s);
}

100000的此output60060。这个观察是真的吗?因为我没有这种方法的具体证据。 我观察到的是假设采用素数数组{2,3,5,7,11}并假设给定的n100。然后观察继续乘以不同的素数,直到得到它>100。那是2*3*5。再次从第一个元素重复数组中的素数。这是2*3*5*2。这是60因子所需的数量12。现在没有素数可以在不超过100的情况下成倍增加。这个观察是真的吗?如果其为真,那么素数最高为37,我们可以轻松处理n<=10000000100以下的所有数字都是60, 72, 84, 9096。我们用这种方法得到这些数字中最小的数字。所有人都有12个因素。 100以下的数字不超过12个因素。

2 个答案:

答案 0 :(得分:1)

我认为这个问题可以通过类似于Hamming Number的算法来解决,实际上你的原始概念也与汉明数非常相似。

汉明号是一个问题,要生成xx = 2^i * 3*j * 5*k,从O(N)中的从小到大,其中N是汉明数的到来生成。

在这里,我认为可以使用类似的概念,但我们必须使用低于上限而不是{2,3,5} 的素数集,我们只需要计算生成数字时的最大素数因子,并在生成数字后输出大于N。

例如,这里是汉明号码列表(使用{2,3,5}进行演示)&lt; 100:

1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 45 48 50 54 60 64 72 75 80 81 90 96 100

60 = 2 ^ 2 * 3 ^ 1 * 5 ^ 1,总因子= 3 * 2 * 2 = 12或

96 = 2 ^ 5 * 3 ^ 1,总因子= 6 * 2 = 12

所以可能有多个答案,但你应该能够在生成汉明号时捕捉它们。

可以证明它在逻辑上是正确的,因为

  1. 数字由素数(素数因子)生成
  2. 数字按顺序生成
  3. 请注意,在您的情况下,基本上您将生成从1到上限的所有正数。

    这是一个有大量不同语言示例的网站,实现此算法以生成汉明数字:https://rosettacode.org/wiki/Hamming_numbers

答案 1 :(得分:-1)

在O(n ^ 2)时间内调整Sieve of Eratosthenes是可行的。

  • 从大小为n的数组开始,即divisors
  • 对于每个号码k小于n增量divisors[k]以及所有其他k*i < n
  • 的索引
  • divisors
  • 中查找较大值的索引