循环节的长度,循环节,循环次数(kmp)
我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数、循环节以及循环节长度
输入
输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100
输出
分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔
样例输入
8.6987698769876987
0.666
5.1
样例输出
4 6987 4
1 6 3
1 1 1
#include
#include
char b[400];
int next[500];
void getnext()//模板
{
int l=strlen(b);
int i=0,j=-1;
next[0]=-1;
while(i
{
if(j==-1||b[i]==b[j])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
int a,l,i;
while(~scanf("%d.%s",&a,b))//输入一个小数用%d.%S的方法便于处理
{
l=strlen(b);//循环节大都是从小数点后中出现,所以不用考虑小数点前得
getnext();//得出每个数的next值
if(l%(l-next[l])==0)//说明从开始判断到结束有循环节
{
printf("%d ",l-next[l]);//循环节的长度
for(i=0;i
{
printf("%c",b[i]);//循环节的组成
}
printf(" %d\n",l/(l-next[l]));//循环了几次
}
else
{
printf("%d ",l);//如果没有循环节,字符串的长度就是循环节的长度
for(i=0;i
printf("%c",b[i]);
printf(" 1\n");//只循环一次
}
}
return 0;
}