题目链接

欧拉函数φ(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. Linux时间相关函数

    相关文件: /etc/localtime  本地时间二级制文件 /etc/sysconfig/clock  时区配置文件 /usr/share/zoneinfo  存储各个时区的二进制文件 时间修改方 ...

  2. JavaScript 时间显示

    <span id="localtime"><span> <script type="text/javascript"> fu ...

  3. 关于angularJS与jquery在使用上的一些感悟

    最近做的项目中,有同时用到angularJS与jquery两种JS框架. 在使用过程中发现,angularJS的用法更像是面向对象的编程模式.它会要求你定义一个view model,然后所有的页面变化 ...

  4. c++ 进程权限的提升

    //提升权限 void CManageProcessDlg::DebugPrivilege() {  HANDLE hToken = NULL;  //打开当前进程的访问令牌  int hRet = ...

  5. Python-Day9 Paramiko模块/进程/线程/RabbitMQ队列

    一.Paramiko模块 1.Paramiko安装 Python的目录下有个Scripts目录,cd到这个目录用这里面的pip命令(如果添加的环境变量可以在cmd直接输入命令):pip install ...

  6. Python开发【第一篇】Python模块中特殊变量

    模块中特殊变量 生产环境中,常用的就是__name__和__file__ __doc__ __package__ __cached__ __name__ __file__ 一. __doc__  #获 ...

  7. IE6和IE7的line-height和现代浏览器不一致的问题

    1.我们发现在网页中设置line-height后,现代浏览器显示正常,可是在IE6 IE7下却不能正确解析,这时需要再额外的为旧版浏览器声明: p{ line-height: 30px; *line- ...

  8. 【Go】 http webserver

    示例1: package main import ( "fmt" "net/http" "encoding/json" ) var i in ...

  9. perl 脚本测试

      原文地址:  http://blog.csdn.net/johnny710vip/article/details/8905239   这是一篇关于perl脚本测试的总结性文章,其中提到了很多实用的 ...

  10. VBS基础篇 - 条件语句

    经常地,当我们编写代码时,我们需要根据不同的判断执行不同操作,我们可以使用条件语句完成这个工作. If...Then...Else 在下面的情况中,您可以使用 If...Then...Else 语句: ...