链接:
https://www.51nod.com/Challenge/Problem.html#problemId=1035
题意:
正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数。
1/6= 0.1(6) 循环节长度为1
1/7= 0.(142857) 循环节长度为6
1/9= 0.(1) 循环节长度为1
思路:
这是一道模拟题,首先找规律,分母中可以拆分出2,5时,排除所有的2,5因数,此时剩下的数都不能除尽,最后来一个除法模拟就行了,比如1/7=0.142857142857,当模拟时产生的余数等于第一个余数时(或者通过辅助数组判重也可以),则此时的长度就为循环节长度。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n, mav = -1, max_i = 0;
cin>>n;
for(int i=2;i<=n;++i){
int k = i;
while(k%2==0)
k/=2;
while(k%5==0)
k/=5;
if(k==1)
continue;
int t = 1 % k;
int flag = t;
int cnt = 1;
while((t*10)%k!=flag){
t = (t*10)%k;
cnt++;
}
if(cnt>mav){
mav = cnt;
max_i = i;
}
}
cout<<max_i<<"\n";
return 0;
}