hpu 1695 问题 A 一道签到题(KMP算法的考察)

来源:互联网 发布:喷绘用什么软件做 编辑:程序博客网 时间:2024/05/21 17:24

本题链接:点击打开链接

本题题意:

        输入一个长度不超过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;}elsej=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;}


 

0 0
原创粉丝点击