题目链接

欧拉函数φ(n)(有时也叫做phi函数)可以用来计算小于n 的数字中与n互质的数字的个数。

当n小于1,000,000时候,n/φ(n)最大值时候的n。

欧拉函数维基百科链接

这里的是p是n的素因子,当素因子有相同的时候只取一个

任意一个正整数都能分解成若干个素数乘积的形式

如下所示:

long phi(int n){
long res=0;
int pi=0;
if(n==1) return 0;
res = n;
pi = 2;
while(n!=1){
if(n%pi==0){
res*=(pi-1);
res/=pi;
while(n%pi==0){
n/=pi;
}
}
pi++;
}
return res;
}

上面res是存放φ(n)

是素因子的数更行res

由于素因子可能相同的

while(n%pi==0){
n/=pi;
}

这里的while循环就是用来去除重复的素因子

然而运行结果:

//    510510 5.539388020833333
// running time=270s483ms

这里要变量一百万次,内循环还要遍历,时间已经超过了欧拉工程的一分钟原则

参考网上程序,改成下面的形式:

long phi2(int n){
long res = 0;
if(n==1) return 0;
int pi=2;
res = n;
while(pi*pi <=n){
if(n%pi==0){
res*=(pi-1);
res/=pi;
while(n%pi==0){
n/=pi;
}
}
pi++;
}
if(n>1){
res*=(n-1);
res/=n;
}
return res;
}

一个结束条件是while(n!=1)

一个结束条件是while(pi*pi<=n)  n的素因子一定小于等于根号n,当pi大于根号n的时候的循环完全是拜拜浪费时间

此时你一定想到素数的循环,这里很类似

运行结果:

//    510510 5.539388020833333
// running time=1s292ms

时间少了很多

在题解报告中,看到用到素数

当这个数的是素数的时候,欧拉函数φ(n) = n-1

当不是素数时候,找出小于n的素数,且能不n整除的数是n的素因子

long phi3(int n){
long res = n;
int pi=2;
if(isPrime(n)||n==1)
res = n-1;
else{
while(pi<=n){
if(n%pi==0 &&isPrime(pi)){
res*=(pi-1);
res/=pi;
}
pi++;
} }
return res; }

结果:

//    510510 5.539388020833333
// running time=1885s497ms

上面程序对找到的素因子,没有去除,同时循环是while(pi<=n),可以进一步优化

while(pi<=n){
if(n%pi==0 &&isPrime(pi)){
res*=(pi-1);
res/=pi;
while(n%pi==0){
n/=pi;
}
}
pi++;
}

结果:

//    510510 5.539388020833333
// running time=111s291ms

时间少了好多

while(pi*pi<=n){
if(n%pi==0 &&isPrime(pi)){
res*=(pi-1);
res/=pi;
// while(n%pi==0){
// n/=pi;
// }
}
pi++;
}

结果:

//    510510 5.539388020833333
// running time=4s531ms

然而while(pi*pi<=n) + 去除相同素因子 的,程序结果不对!!!

while(pi*pi<=n){
if(n%pi==0 &&isPrime(pi)){
res*=(pi-1);
res/=pi;
while(n%pi==0){
n/=pi;
}
}
pi++;
}
if(n>1) res = res/n*(n-1);

这样就对了

结果:

//    510510 5.539388020833333
// running time=1s454ms

去重后,最后一个n也是符合条件的

这个时间竟然比第2个的时间还要长。

Python程序:

import time as time

def phi(n):
if n==1 :return 0
res = n
pi = 2
while(pi*pi<=n):
if n%pi==0:
res=res/pi*(pi-1)
while n%pi==0:
n/=pi
pi+=1
if n>1:res=res/n*(n-1)
return res
# 510510
# running time: 32.007999897 s
if __name__ == '__main__':
t0 = time.time()
Max_n = 1000000
result= 1
value = 0.0
for n in range(2,Max_n):
euler = phi(n)
temp = n/(euler*1.0)
if temp>value:
value = temp
result = n
print result
print "running time:",(time.time() - t0),'s'

全部的Java程序:

package project61;

public class P69{

    void run(){

        long max_n = 1000000;
double value = 0.0;
long euler = 0;
long N=0; for(int i=2;i<=max_n;i++){ euler = phi3(i);
// System.out.println(i+" "+euler);
double temp = (double)i/(euler*1.0);
if(temp>value){
value = temp;
N = i;
} }
System.out.println(N+" "+value);
}
long phi3(int n){
long res = n;
int pi=2;
if(isPrime(n)||n==1)
res = n-1;
else{
while(pi*pi<=n){
if(n%pi==0 &&isPrime(pi)){
res*=(pi-1);
res/=pi;
while(n%pi==0){
n/=pi;
}
}
pi++;
}
if(n>1) res = res/n*(n-1);
}
return res; }
// 510510 5.539388020833333
// running time=1885s497ms // 510510 5.539388020833333
// running time=111s291ms // 510510 5.539388020833333
// running time=4s531ms // 510510 5.539388020833333
// running time=1s454ms
boolean isPrime(int num){
if(num==2||num==3||num==5||num==7) return true;
if(num<=1||num%2==0||num%3==0) return false;
for(int i=2;i<=Math.sqrt(num)+1;i++){
if(num%i==0) return false;
}
return true;
}
long phi2(int n){
long res = 0;
if(n==1) return 0;
int pi=2;
int k =0;
res = n;
while(pi*pi <=n){
if(n%pi==0){
res*=(pi-1);
res/=pi;
while(n%pi==0){
n/=pi;
}
}
pi++;
}
if(n>1){
res*=(n-1);
res/=n;
}
return res;
}
// 510510 5.539388020833333
// running time=1s292ms long phi(int n){
long res=0;
int pi=0;
if(n==1) return 0;
res = n;
pi = 2;
while(n!=1){
if(n%pi==0){
res*=(pi-1);
res/=pi;
while(n%pi==0){
n/=pi;
}
}
pi++;
}
return res;
}
// 510510 5.539388020833333
// running time=270s483ms public static void main(String[] args){
long start = System.currentTimeMillis();
new P69().run();
long end = System.currentTimeMillis();
long time = end - start;
System.out.println("running time="+time/1000+"s"+time%1000+"ms"); }
}

欧拉工程第69题:Totient maximum的更多相关文章

  1. 欧拉工程第67题:Maximum path sum II

    By starting at the top of the triangle below and moving to adjacent numbers on the row below, the ma ...

  2. 欧拉工程第70题:Totient permutation

    题目链接 和上面几题差不多的 Euler's Totient function, φ(n) [sometimes called the phi function]:小于等于n的数并且和n是互质的数的个 ...

  3. 欧拉工程第66题:Diophantine equation

    题目链接 脑补知识:佩尔方差 上面说的貌似很明白,最小的i,对应最小的解 然而我理解成,一个循环的解了,然后就是搞不对,后来,仔细看+手工推导发现了问题.i从0开始变量,知道第一个满足等式的解就是最小 ...

  4. 欧拉工程第65题:Convergents of e

    题目链接 现在做这个题目真是千万只草泥马在心中路过 这个与上面一题差不多 这个题目是求e的第100个分数表达式中分子的各位数之和 What is most surprising is that the ...

  5. 欧拉工程第74题:Digit factorial chains

    题目链接:https://projecteuler.net/problem=74 数字145有一个著名的性质:其所有位上数字的阶乘和等于它本身. 1! + 4! + 5! = 1 + 24 + 120 ...

  6. 欧拉工程第56题:Powerful digit sum

    题目链接   Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; im ...

  7. 欧拉工程第55题:Lychrel numbers

    package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; import java.util ...

  8. 欧拉工程第54题:Poker hands

    package projecteuler51to60; import java.awt.peer.SystemTrayPeer; import java.io.BufferedReader; impo ...

  9. 欧拉工程第53题:Combinatoric selections

    package projecteuler51to60; class p53{ void solve1(){ int count=0; int Max=1000000; int[][] table=ne ...

随机推荐

  1. javascript框架库API入口

    underscorejs : http://learning.github.io/underscore/

  2. WCF 服务与终结点(四)

    服务 服务是一组公开功能的集合. 服务内部包含了如语言.技术.版本与框架等概念,服务之间的交互只允许使用规定的通信模式 外界客户端并不知道服务内部的实现细节,所以WCF服务通常通过元数据的方式描述可用 ...

  3. C#使用SocketAsyncEventArgs操作套接字的简单异步通讯

    SocketAsyncEventArgs是一个套接字操作的类,主要作用是实现socket消息的异步接收和发送,跟Socket的BeginSend和 BeginReceive方法异步处理没有多大区别,它 ...

  4. windows程序消息机制(Winform界面更新有关)

    windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Win ...

  5. TextView中gravity属性值测定

    Attributes Explain top 不改变控件大小,对齐到容器顶部 bottom 不改变控件大小,对齐到容器底部 left 不改变控件大小,对齐到容器左侧 right 不改变控件大小,对齐到 ...

  6. ref 和out的用法以及区别

    在项目其实很少用ref和out,但是我们常用的工具resharep在帮我们重构的时候难免会给我们重构成带有ref或者是out的方法. 本人也是用的少所以难免忘记,留下简略笔记,以供后来自我参考: 为何 ...

  7. GITHUB 提交错误 Error: Permission denied (publickey) 解决

    1.  在开发机上生成自己的密钥 ssh-keygen -b 1024 -t rsa -b 指密钥对长度  -t 指加密方式 Enter file in which to save the key ( ...

  8. self,parent,this区别

    我容易混淆public,private,protected,还容易混淆this,self这些东西.前面已经写了一篇关于public,private,protected博文了,下面来说一下this,se ...

  9. [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等

    [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等 http://blog.csdn.net/yiya1989/article/details/784 ...

  10. Entity Framework4.0 (六) EF4的 增加、删除、更改

    前面介绍了EF4的查询功能,主要是借助于LINQ的强大的查询功能和它简单的语法.让我们可以完全面向对象集体去进行查询,而不必去劳心处理那些关系型数据库表的操作.这样我们更容易把主要精力集中在业务逻辑上 ...