本题链接:点击打开链接
本题题意:
输入一个长度不超过200,数值不超过100的循环小数,求出小数点后的循环节,循环节长度,循环次数。
解题思路:
本题为KMP算法的较全面的考察,首先将小数点后的数存放到一个数组中,并求出next数组,然后,由KMP算法可知,循环节长度为:【k-next[k]】;循环次数为【k/(k-next[k])】,知此,循环节也不难求了,按循环长度直接输出即可。
参考代码:
#include<stdio.h>
#include<string.h>
char str[300];
char buf[220];
int next[220];
void getnext(int l)
{
int i=0,j=-1;
next[i]=j;
while(i<l)
{
if(j==-1||buf[i]==buf[j])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
while(scanf("%s",str)!=EOF)
{
int i=0;
while(str[i]!='.')
i++;
int len=strlen(str);
int k=0;
for(int j=i+1;j<len;j++)
buf[k++]=str[j];
getnext(k);
printf("%d ",k-next[k]);//循环节长度
for(int i=0;i<k-next[k];i++)
printf("%c",buf[i]);
printf(" %d\n",k/(k-next[k]));//循环次数
}
return 0;
}