[Project Euler] Problem 26

本文通过分析单位分数的循环节特点,提供了一种高效的算法来找出1000以内的最长循环节分数。通过去除基数中2和5的质因数,利用数学规律判断循环节长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几日,一直忙于毕业设计,很久没有更新了

偶得闲暇,开始Level1的第一题

A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:

1/20.5
1/30.(3)
1/40.25
1/50.2
1/60.1(6)
1/70.(142857)
1/80.125
1/90.(1)
1/100.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.

我们知道,如果一个数的质因子全是2和5的话,这个数的倒数是不会无限循环的

如2,4,5,8,10

而一个数把质因子中的2和5除去后,得到一个数,我们称之为“基数”吧

这个数和它的基数的倒数循环的长度是相同的

比如说3和6的倒数的循环长度都是1

而怎么计算一个数的循环长度呢

只需要知道它能被多少长度的9整除就行了

3能被9整除,所以它的循环长度是1

7能被999999整除,商正好是循环体142857,所以它的循环长度是6

我想这一点大家应该很好理解吧

有前面的分析我们可以很容易得到这道题的解法

先求一个数的基数,如果是它本身,则计算它的循环长度

如果不是它自身,那它的循环长度等于基数的循环长度

我们规定1的循环长度是0,这样所以只含2,5为质因子的数的基数都为1,循环长度为0

我们来看看代码

#include <iostream>
usingnamespace std;

int getBase(int value);
int getCycle(constint value);

int main() {
int length[1000] = { 0 };
int tmp;
int max =0;
int value =0;
for (int i =2; i <1000; i++) {
tmp
= getBase(i);
if (tmp < i) {
length[i]
= length[tmp];
}
else {
length[i]
= getCycle(i);
}
}
for (int i =0; i <1000; i++) {
if(length[i]>max){
max
= length[i];
value
= i;
}
}
cout
<< value;
return0;
}

int getBase(int value) {
while (value %2==0) {
value
/=2;
}
while (value %5==0) {
value
/=5;
}
return value;
}

int getCycle(int value) {
if (9% value ==0) {
return1;
}
elseif (99% value ==0) {
return2;
}
elseif (999% value ==0) {
return3;
}
else {
int i =4;
int dividend =9999;
while (dividend % value !=0) {
i
++;
dividend
= dividend % value *10+9;
}
return i;
}
}

结果如下:

好啦,26题告一段落

转载于:https://www.cnblogs.com/xianglan/archive/2011/03/23/1992601.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值