题目链接:传送门
首先一个数如果能被2或者5整除,整除到最后结果等于1,那么这个数被1除一定不是循环小数。
像3 6 7这些数的倍数被1除都是无限循环小数。
这个题就相当于求 10^a%n=1把最小的a求出来。
所以我一开始就用Pow函数写了一个,结果发现像1/49这种有理数,无限循环小数,连电脑的计算器都找不出他的循环节,他的循环节太后了,开Pow是找不出来的。
所以就模拟除法,每次除出来的余数如果不是1就乘以10继续除,除到余数为1即出现了循环为止
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1010
int main(){
int i,j,n,m,k;
while(scanf("%d",&n)!=EOF){
int res=0,ans=0;
for(i=2;i<=n;i++){
int x=i;
while(x%2==0) x/=2;
while(x%5==0) x/=5;
if(x==1){
continue;
}
int j=0,p=1;
do{
p=p*10%x;
j++;
}while(p!=1);
if(j>=res){
res=j;
ans=i;
}
}
cout<<ans<<endl;
}
return 0;
}