欧拉工程第26题:Reciprocal cycles
2015-05-04 20:19
239 查看
题目链接:https://projecteuler.net/problem=26
题目:
A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:
1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
Where 0.1(6) means 0.166666…, and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.
Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.
求1000一下,1/d的小数的循环体最长的那个d。
一个字:坑。
思路:
1.根据编程之美上面小数化成分数的思想===>没有实现,也无法实现
2.想想应该与素数有关系,或者求得答案就是一个素数===>下面也就是不知道怎么搞了
网上看别人怎么做的
1.根据编程之美中小数化成分数的思想+素数===>得出答案
2.让10的倍数分别处于这个数,当出现循环的时候,结束,除数就是循环体中的数字
3.看这个数字能让被多少个9整除,比如:99999%d==0,循环体长度就是5
对于1,应用到费马小定理,具体没理解意思。
对于2、3应该是差不多的方法。
给个关于质数的链接:链接,我们这里求得是全循环质数。里面有简短介绍。
2对应的程序:
上面程序还是有点小问题的,在输出6的循环体长度的时候是2,然而1/6=0.1(6) ,循环体只有6 没有1,长度是1,程序没有判定小数部分不是循环体的。 但是输出结果没影响。。。。。。。
看到一个这样的定理:
,这个其实也就是费马小定理的应用。
对任意的质数,一定存在正整数k使10的k次方除以n的余数是1,这里的k就是1/n,的循环体的长度。这样上面打代码有问题就对了,可以对上面代码进行优化。只对是素数的进行while里面程序运算。
这样看来上面的三个做法应该是一样,只是在判断是有小的差别。
增加判断素数的时间能提高10-20ms
题目:
A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:
1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
Where 0.1(6) means 0.166666…, and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.
Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.
求1000一下,1/d的小数的循环体最长的那个d。
一个字:坑。
思路:
1.根据编程之美上面小数化成分数的思想===>没有实现,也无法实现
2.想想应该与素数有关系,或者求得答案就是一个素数===>下面也就是不知道怎么搞了
网上看别人怎么做的
1.根据编程之美中小数化成分数的思想+素数===>得出答案
2.让10的倍数分别处于这个数,当出现循环的时候,结束,除数就是循环体中的数字
3.看这个数字能让被多少个9整除,比如:99999%d==0,循环体长度就是5
对于1,应用到费马小定理,具体没理解意思。
对于2、3应该是差不多的方法。
给个关于质数的链接:链接,我们这里求得是全循环质数。里面有简短介绍。
2对应的程序:
void solve2(){ int remainder=0; int max=0; int result=0; for(int d=2;d<1000;d++){ ArrayList list=new ArrayList(); list.add(new Integer(1)); int count=1; int temp=10; while(true){ remainder= temp%d; if(list.contains(remainder) || remainder==0){ if(count>max){ max=count; result=d; } if(d==6){ System.out.println(list); System.out.println(count); } break; }else{ list.add(new Integer(remainder)); temp=remainder*10; count++; } } } System.out.println(result); }
上面程序还是有点小问题的,在输出6的循环体长度的时候是2,然而1/6=0.1(6) ,循环体只有6 没有1,长度是1,程序没有判定小数部分不是循环体的。 但是输出结果没影响。。。。。。。
看到一个这样的定理:
,这个其实也就是费马小定理的应用。
对任意的质数,一定存在正整数k使10的k次方除以n的余数是1,这里的k就是1/n,的循环体的长度。这样上面打代码有问题就对了,可以对上面代码进行优化。只对是素数的进行while里面程序运算。
这样看来上面的三个做法应该是一样,只是在判断是有小的差别。
package projecteuler21to30;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
class level26{void solve2(){ int remainder=0; int max=0; int result=0; for(int d=2;d<1000;d++){ ArrayList list=new ArrayList(); list.add(new Integer(1)); int count=1; int temp=10; while(true){ remainder= temp%d; if(list.contains(remainder) || remainder==0){ if(count>max){ max=count; result=d; } if(d==6){ System.out.println(list); System.out.println(count); } break; }else{ list.add(new Integer(remainder)); temp=remainder*10; count++; } } } System.out.println(result); }
void solve1(){
int remainder=0;
int max=0;
int result=0;
for(int d=2;d<1000;d++){
ArrayList list=new ArrayList();
list.add(new Integer(1));
int count=1;
int temp=10;
if(isPrime(d)){
while(true){
remainder= temp%d;
if(list.contains(remainder) || remainder==0){
if(count>max){
max=count;
result=d;
}
if(d==6){
System.out.println(list);
System.out.println(count);
}
break;
}else{
list.add(new Integer(remainder));
temp=remainder*10;
count++;
}
}
}
}
System.out.println(result);
}
boolean isPrime(int num){
for(int i=2;i<=Math.sqrt(num);i++){
if(num%i==0){
return false;
}
}
return true;
}
}
public class Problem26 {
public static void main(String[] args){
Date beginTime=new Date();
new level26().solve2();//983
Date endTime=new Date();
long Time = endTime.getTime()-beginTime.getTime();
System.out.println("Time:"+Time/1000+"秒"+Time%1000+"毫秒");
}
}
增加判断素数的时间能提高10-20ms
相关文章推荐
- 欧拉工程第26题 找出小于1000的数字中令1/d拥有最长循环圈的数字d
- 我的欧拉工程之路_8
- 欧拉工程第7题 找出第10001个质数
- 欧拉工程第14题 找出以100万以下的数字开始的最长序列
- 欧拉工程第一题 找出1000以下的自然数中,属于3和5的倍数的数字之和。
- 欧拉工程第30题 找出所有能够写成各位数字5次方之和的数之和
- 欧拉工程第38题:Pandigital multiples
- 欧拉工程第41题:Pandigital prime
- 欧拉工程第50题:Consecutive prime sum
- 欧拉工程第53题:Combinatoric selections
- 欧拉工程第58题:Spiral primes
- 欧拉工程第71题:Ordered fractions
- 欧拉工程第8题 找出这个1000位数字中连续13个数字乘积的最大值
- 欧拉工程第15题 从20*20的网格的左上角通往右下角有多少条路
- 欧拉工程第二题 在斐波拉契数列中找出4百万以下的项中值为偶数的项之和
- 欧拉工程第23题 算出所有不能写成两个过剩数之和的正整数之和
- 欧拉工程第21题:Amicable numbers
- 欧拉工程第39题:Integer right triangles
- Java进阶之欧拉工程 第三篇【持续更新】
- Java进阶之欧拉工程 第十一篇【持续更新】