码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-08 16:35:23      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

本题题意:

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


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:

原文地址:http://blog.csdn.net/lsgbb/article/details/47359223

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!