给定一个数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
的此output为60060
。这个观察是真的吗?因为我没有这种方法的具体证据。
我观察到的是假设采用素数数组{2,3,5,7,11}
并假设给定的n
是100
。然后观察继续乘以不同的素数,直到得到它>100
。那是2*3*5
。再次从第一个元素重复数组中的素数。这是2*3*5*2
。这是60
因子所需的数量12
。现在没有素数可以在不超过100
的情况下成倍增加。这个观察是真的吗?如果其为真,那么素数最高为37
,我们可以轻松处理n<=10000000
。100
以下的所有数字都是60, 72, 84, 90
和96
。我们用这种方法得到这些数字中最小的数字。所有人都有12
个因素。 100以下的数字不超过12
个因素。
答案 0 :(得分:1)
我认为这个问题可以通过类似于Hamming Number的算法来解决,实际上你的原始概念也与汉明数非常相似。
汉明号是一个问题,要生成x
,x = 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到上限的所有正数。
这是一个有大量不同语言示例的网站,实现此算法以生成汉明数字:https://rosettacode.org/wiki/Hamming_numbers
答案 1 :(得分:-1)
在O(n ^ 2)时间内调整Sieve of Eratosthenes是可行的。
n
的数组开始,即divisors
。k
小于n
增量divisors[k]
以及所有其他k*i < n
divisors