我试图通过在线判断系统解决一个问题。我有一个有效的解决方案,但效率不高。这是问题所在:
在产品中我们可以想象的最小数量n = a∙b如k?产品a∙b和b∙a是所有数字都是自然的(1≤k≤50)。
输入一个数字k。 输出一个数字n。
我的代码没有通过四次测试。这对于k = 31,37,47来说太慢了。我一直在考虑这个问题2天,但没有改善。这是我的代码,请分享,如果您有任何想法。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int prime[10000];
long x,j,i,flag,k,length,p,checker,count,number;
int main()
{
prime[0]=2;
scanf("%ld",&k);
//I find prime numbers between 1 and 1000. 1000 can be changed, just for testing
for (i=3;i<=1000;i=i+2)
{
flag=0;
for (j=2;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
x++;
prime[x]=i;
}
}
length=x;
//this loop is too big I know, again for testing. I suspect, there must be a way to make some changes to this for loop
for (i=1;i<10000000000;i++)
{
number=i;
p=1;
for(x=0;x<=length;x++)
{
if(prime[x]>sqrt(i))
break;
count=0;
while(number%prime[x]==0)
{
number=number/prime[x];
count++;
}
p=p*(count+1);
//I find prime factors of numbers and their powers, then calculate number of divisors
}
//printf("%d\n",p);
//number of ways is just number of divisors/2 or floor (divisors/2)+1
if(p%2==0)
checker=p/2;
else
checker=floor(p/2)+1;
if(checker==k)
{
printf("%ld\n",i);
break;
}
}
return 0;
}
答案 0 :(得分:1)
如果我正确地理解了这个问题,它会问你哪个数字n最少,只有2k除数(我应该考虑1和n?)
实际上如果一个数字有一个除数a,则n / a = b是一个整数,n = a * b(只计算一次a和b,所以你应该除以2除数的数量)
修改
这样做确实非常耗时。所以这就是这个想法;
表示n = p1 ^(a1)* p2 ^(a2)... pn ^(an)(这是数字的素数分解)的数n,除数的数量是(a1 + 1) )(A2 + 1)...(AN + 1)
因此,如果要查找具有k除数的数,请将k分解。然后将最大因子分配给最小的素数;例如,如果k = 2 * 5 * 7,那么n应该是2 ^ 7 * 3 ^ 5 * 5 ^ 2
我知道这不是因为我没有考虑到(a,b)等于(b,a)但是玩了一下它应该有效
例如
取k = 37.然后加倍数 - (考虑对称性)。你得到74。 现在,如果你能想象n为n = n * 1,那么你只需要因子74(即2 * 37); 然后给出36比2和1比3,领先n = 2 ^(36)* 3 = 206158430208
如果你不能,那么你需要在你之前得到的数字上加1(在这种情况下,74 + 1 = 75 = 25 * 3);这样你得到n = 2 ^ 24 * 3 ^ 2 = 150994944
如果不是上述情况,那么我可能错了......