【欧拉计划】26. Reciprocal cycles

【思路】这题的关键就是如何得到循环节。试想,当我们把一个单位分数扩大 $10$ 的若干次幂之后,得到的数的整数部分会出现循环。

因此,我们可以重复地将一个初始值为 $1$ 的数对单位分数的分母取模,然后乘上 $10$。

每操作一次,就检查这个数是否已经出现过。如果出现过,就说明已经找到循环节;否则标记并继续操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
int ans,maxn;
bool vis[10001];
int main()
{
for(int i=3;i<1000;i+=2)
{
int r=1,cur=0;
memset(vis,false,sizeof(vis));
while(!vis[r])
{
vis[r]=true;
r=r%i*10;
++cur;
}
if(cur>maxn)
{
ans=i;
maxn=cur;
}
}
printf("%d",ans);
return 0;
}

【欧拉计划】26. Reciprocal cycles

https://hensier.github.io/projecteuler/26/

作者

hensier

发布于

2022-05-01

更新于

2023-01-02

许可协议

评论