欧拉项目第五题
Posted shuaihui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉项目第五题相关的知识,希望对你有一定的参考价值。
题目:
2520是最小的能被1-10中每个数字整除的正整数。
最小的能被1-20中每个数整除的正整数是多少?
分析:
解题方法
题目的实质是求几个数的最小公倍数。
任何一个正整数都可以表示成几个素数的次方的乘积
假设PnPn表示第n个素数,那么任意正整数可以通过下面的式子获得:
Num=Pk11Pk22Pk33?Pknn,n∈N+,kn∈NNum=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); }
解题方法
题目的实质是求几个数的最小公倍数。
任何一个正整数都可以表示成几个素数的次方的乘积
假设Pn表示第n个素数,那么任意正整数可以通过下面的式子获得:
Num=Pk11Pk22Pk33?Pknn,n∈N+,kn∈N
一个整数要能被1-10的所有整数整除,那么就等同于他能被1-10之间的所有素数整除。那么此时:
2520=2k1×3k2×5k3×7k4
Kn的取值要保证最终值可以被所有含Pn约数的数整除。以P1=2举例,注意到8是含有约数2的最大整数,所以K1=3。同理求得其它的k值。最终得到以下式子:
2520=23×32×5×7
那么对于能被1-20的所以整数整除的数,它可以表示成如下形式:
Num=2k1×3k2×5k3×7k4×11k5×13k6×17k7×19k8
最终求得:
232792560=24×32×5×7×11×13×17×19
以上是关于欧拉项目第五题的主要内容,如果未能解决你的问题,请参考以下文章