循环节的长度,循环节,循环次数(kmp)
输入
输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100
输出
分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔
样例输入
8.6987698769876987 0.666 5.1
样例输出
4 6987 4 1 6 3 1 1 1#include<stdio.h> #include<string.h> char b[400]; int next[500]; void getnext()//模板 { int l=strlen(b); int i=0,j=-1; next[0]=-1; while(i<l) { 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<l-next[l];i++) { printf("%c",b[i]);//循环节的组成 } printf(" %d\n",l/(l-next[l]));//循环了几次 } else { printf("%d ",l);//如果没有循环节,字符串的长度就是循环节的长度 for(i=0;i<l;i++) printf("%c",b[i]); printf(" 1\n");//只循环一次 } } return 0; }