两种欧拉函数模板
求歐拉函數代碼的方式:直接求和打表
歐拉函數的作用:一個數n,求小于n的互質的個數。特例:1——oula(1)=1;
歐拉函數的公式:
其中i為x所有質因數。注意:每種質因數只一個
為什么會這樣?首先,互質的兩個數一定不能有公共因數。比如9和7互質,9和12不互質,因為有共同因數3.
那么我難道需要一個個循環比較嗎?
答案先然不可能,因為如果數值過大這是個很大的復雜度。那么我該如何處理?
換一種思維。比如求24中的互質個數。答案是1,5,7,11,13,17,19,23。共8個
附上直接求代碼:
private static int oula(int team) {int i=0;int res=team;int team1=team;for(i=2;i<(int)Math.sqrt(team1) 1;i ){if(team%i==0) {res=res/i*(i-1);while(team%i==0) {team/=i;}//保證沒有i作為因子 }}if(team>1)res=res/team*(team-1);//說明后面還有一個比較大的互質因數大小為teamreturn res;}其中,res為結果,team1作為求因數用。如果實在不能理解,好好看下質因數分解。
打表代碼:
int a[]=new int[1000001];for(int i=1;i<1000001;i ){a[i]=i;}for(int i=2;i 2<1000001;i =2){a[i]/=2;}for(int i=3;i 2<1000001;i =2){if(a[i]==i){for(int j=i;j i<=1000001;j =i){a[j]=a[j]/i*(i-1);}}}如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai
總結
- 上一篇: springboot入门demo详解(解
- 下一篇: Springboot整合redis(le