描述
我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循环小数这一部分时不是太明白循环体是什么意思(比如说3.23232323的循环体是23、2323、23232323),假设我们现在的循环小数都是严格循环的并且有限的,也就是说不出现2.16666666(循环体为6,长度为1)的情况,只有123123这样的循环出现。给他一个小数,他需要找出最小循环体的长度、循环体和循环的次数,请你帮他解决这个问题。
-
输入
- 输入的第一行是t,表示有t组测试数据(t<=100)。
随后的t行,每行都是一个小于10并且大于0的小数(总长度<=200)。
输出 - 对每组输入,输出结果单独成行,输出最小循环体的长度、循环体和出现循环的次数。 样例输入
-
3 8.6987698769876987 0.666 5.1
样例输出 -
4 6987 4 1 6 3 1 1 1
//AC代码
#include<stdio.h> #include<string.h> char str[300]; char s[300]; int next[300]; int len; void Get_Next() { int i=0,j=-1; next[0]=-1; while(i<len) { if(j==-1 || s[i]==s[j]) { ++i,++j; next[i]=j; } else j=next[j]; } } int main() { int i,T; scanf("%d",&T); while(T--) { scanf("%s",str); len=strlen(str); for(i=0;i<len;++i) { if(str[i]=='.') break; } int k=0; for(i=i+1;i<len;++i) s[k++]=str[i]; len=k; Get_Next(); printf("%d ",len-next[len]);//最大字符串长度 for(i=0;i<len-next[len];++i) printf("%c",s[i]); printf(" "); printf("%d\n",len/(len-next[len]));//重复几次 } return 0; }