本题题意:
输入一个长度不超过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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-07 14:20:42