| |||
description | |||
正整数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的数中倒数循环节长度最长的那个数 | |||
sample_input | |||
10 | |||
sample_output | |||
7 | |||
hint | |||
source | |||
51nod点头网 |
题解:林大的oj网站上的题做起来就是舒服,中文题多啊~抽屉原则,水题,但是需要一点思想,新手,代码可能不够简洁,大家理解意思就好。
code:
//2016.2.10//做完刘汝佳59页3.8练习以后再nefuoj上找到的练习;
//依旧是同一个思路;
//难得的一次ac的题;
using namespace std;
int main()
{
double digit[1050];//每一位的小数;
int integer[1050];//每一位的整数;
int ans;
int ansn=1;
int n;
while(cin>>n)
{
for(int i=4; i<=n; i++)//4之前的循环节都是1,所以从4开始循环就可以;
{
bool flag=0;
digit[0]=1;
integer[0]=1.0/(i*1.0);
for(int j=1; ; j++)
{
digit[j]=(digit[j-1]-integer[j-1]*i)*10;
integer[j]=digit[j]/i;
for(int k=1; k<j; k++)
{
if(digit[j]==digit[k])
{
ans=j-k+1;
flag=1;
break;
}
}
if(flag) break;
}
ansn<ans? ansn=ans: ansn=ansn;//求ans的最大值;
}
cout<<ansn<<endl;
}
return 0;
}