带素数的代码

时间:2012-12-04 22:04:09

标签: primes

我试图通过在线判断系统解决一个问题。我有一个有效的解决方案,但效率不高。这是问题所在:

在产品中我们可以想象的最小数量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;
    }

1 个答案:

答案 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

如果不是上述情况,那么我可能错了......