整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数,假如存在多个最优的答案,输出所有答案中最大的那个数。
1/6= 0.1(6) 循环节长度为1
1/7= 0.(142857) 循环节长度为6
1/9= 0.(1) 循环节长度为1
Input
输入n(10 <= n <= 1000)
Output
输出<=n的数中倒数循环节长度最长的那个数
Input示例
10
Output示例
7
水水更健康
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
int ans[1005];
int flag[10005];
int hand(int k){
memset(flag,0,sizeof(flag));
int mod=k,chu=1,d;
flag[k]=1;
for(int i=2;;i++){
while(chu<mod) chu*=10;
int b=chu%mod;
if(b==0) break;
if(flag[b]!=0){
d=i-flag[b];
return d;
}
flag[b]=i;
chu=b;
}
return 0;
}
void init(){
for(int i = 1; i<= 1000; i++){
ans[i] = hand(i);
}
// for(int i=1;i<=10;i++)
// cout<<i<<" "<<ans[i]<<endl;
}
int main(){
int n,b;
memset(ans,0,sizeof(ans));
init();
while(scanf("%d",&n)!=EOF){
int maxi = 0;
for(int i=1;i <= n; i++){
if(ans[i] >= maxi ){
b = i;
maxi =ans[i];
}
}
printf("%d\n",b);
}
return 0;
}