循环小数 南阳oj329 【KMP next数组的应用】

来源:互联网 发布:企查查软件下载 编辑:程序博客网 时间:2024/06/08 04:03
描述

我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循环小数这一部分时不是太明白循环体是什么意思(比如说3.23232323的循环体是23、2323、23232323),假设我们现在的循环小数都是严格循环的并且有限的,也就是说不出现2.16666666(循环体为6,长度为1)的情况,只有123123这样的循环出现。给他一个小数,他需要找出最小循环体的长度、循环体和循环的次数,请你帮他解决这个问题。

输入
输入的第一行是t,表示有t组测试数据(t<=100)。
随后的t行,每行都是一个小于10并且大于0的小数(总长度<=200)。
输出
对每组输入,输出结果单独成行,输出最小循环体的长度、循环体和出现循环的次数。
样例输入
38.69876987698769870.6665.1
样例输出
4 6987 41 6 31 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;}elsej=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;}


0 0