欧拉项目第五题

题目:

2520是最小的能被1-10中每个数字整除的正整数。

最小的能被1-20中每个数整除的正整数是多少?

分析:

解题方法

题目的实质是求几个数的最小公倍数。

任何一个正整数都可以表示成几个素数的次方的乘积

假设PnPn表示第n个素数,那么任意正整数可以通过下面的式子获得:

 
Num=Pk11Pk22Pk33Pknn,nN+knNNum=P1k1P2k2P3k3⋯Pnkn,n∈N+,kn∈N

一个整数要能被1-10的所有整数整除,那么就等同于他能被1-10之间的所有素数整除。那么此时:

 
2520=2k1×3k2×5k3×7k42520=2k1×3k2×5k3×7k4


KnKn的取值要保证最终值可以被所有含PnPn约数的数整除。以P1=2P1=2举例,注意到8是含有约数2的最大整数,所以K1=3K1=3。同理求得其它的k值。最终得到以下式子:

 
2520=23×32×5×72520=23×32×5×7


那么对于能被1-20的所以整数整除的数,它可以表示成如下形式:

 
Num=2k1×3k2×5k3×7k4×11k5×13k6×17k7×19k8Num=2k1×3k2×5k3×7k4×11k5×13k6×17k7×19k8


最终求得:

 
232792560=24×32×5×7×11×13×17×19
那么这些素数的次方怎么求呢?以2为例子,我们先假设pow(2,x)=20,两边同时乘于log10,则x=log10(20)/log10(2);
#include<stdio.h>
#include<math.h>
int POW(int a,int b)
{
    int ans=1;
    for(int i=1 ; i<=b ; i++)
    ans=a*ans;
    return ans;
}
int main( )
{
    int p[10]={0,2,3,5,7,11,13,17,19};
    int a[30];
    int k=20;
    int N=1;
    int i=1;
    bool op=true;
   int li=sqrt(k);
    while(p[i]<=k)
    {
        a[i]=1;
        if(p[i]<=li)
        {
            a[i]=floor(log(k)/log(p[i]));
        }

        i = i+1;

    }
    for(int i=1 ; i<=8 ; i++)
    {
        N=N*POW(p[i],a[i]);
    }
    printf("%d\n",N);

}
View Code

解题方法

题目的实质是求几个数的最小公倍数。

任何一个正整数都可以表示成几个素数的次方的乘积

假设PnPn表示第n个素数,那么任意正整数可以通过下面的式子获得:

 
Num=Pk11Pk22Pk33Pknn,nN+knNNum=P1k1P2k2P3k3⋯Pnkn,n∈N+,kn∈N

 

一个整数要能被1-10的所有整数整除,那么就等同于他能被1-10之间的所有素数整除。那么此时:

 
2520=2k1×3k2×5k3×7k42520=2k1×3k2×5k3×7k4


KnKn的取值要保证最终值可以被所有含PnPn约数的数整除。以P1=2P1=2举例,注意到8是含有约数2的最大整数,所以K1=3K1=3。同理求得其它的k值。最终得到以下式子:

 
2520=23×32×5×72520=23×32×5×7


那么对于能被1-20的所以整数整除的数,它可以表示成如下形式:

 
Num=2k1×3k2×5k3×7k4×11k5×13k6×17k7×19k8Num=2k1×3k2×5k3×7k4×11k5×13k6×17k7×19k8


最终求得:

 
232792560=24×32×5×7×11×13×17×19

猜你喜欢

转载自www.cnblogs.com/shuaihui520/p/9048145.html