题目链接

欧拉函数φ(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. js日期相关函数总结分享

    一个倒计时程序,因为经常要在手机端访问,所以没有引用jquery,对于用习惯jquery的我还真不习惯. 下面简单说明js日期相关函数,并说明实现倒计时的原理 var dateTo=new Date( ...

  2. java web 路径 --转载

    主题:java(Web)中相对路径,绝对路径问题总结 1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:\xyz\test.txt 代表 ...

  3. delphi图形图像开发相关

    ①delphi的图形处理(doc) http://wenku.baidu.com/view/519df09951e79b89680226ee.html ②delphi的图形图像处理(ppt) http ...

  4. 通过js获取DropDownList的选中项

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  5. Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join

    关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...

  6. Python数据结构——栈、队列的实现(二)

    1. 一个列表实现两个栈 class Twostacks(object): def __init__(self): self.stack=[] self.a_size=0 self.b_size=0 ...

  7. ActiveMQ之deliveryMode

    在下面的例子中,分别发送一个Persistent和nonpersistent的消息,然后关闭退出JMS. import javax.jms.Connection;import javax.jms.De ...

  8. SSH时不需输入密码

      我这里有2台机器,一台装了Teradata数据库,ip是192.168.184.128,称它为teradata-pc:另一台装了Oracle数据库,ip地址是192.168.184.129,称它为 ...

  9. cdev_系列函数

    内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义: linux-2.6.22/include/linux/cdev.h struct cdev {    struct kobject ...

  10. Asp.Net生命周期系列二

    在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1,    IIS肯定是没有眼睛 ...