您的位置:首页 > 其它

周赛-一道签到题(kmp)

2015-08-10 09:28 218 查看
问题 A: 一道签到题

时间限制: 2 Sec 内存限制: 128 MB

提交: 61 解决: 26

[提交][状态][讨论版]

题目描述

我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数、循环节以及循环节长度

输入

输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100

输出

分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔

样例输入

8.6987698769876987

0.666

5.1

样例输出

4 6987 4

1 6 3

1 1 1

//hpuoj-周赛一:一道签到题
//题目大意:给你一列数字(浮点型)找出这列数中小数部分的循环节的循环次数、
//循环节以及循环节长度.
//解题思路:首先,定义两个字符数组a[220]、b[220],这列数当成字符型处理;
//由于只考虑小数部分,所以输入到 a数组之后直接把小数部分存到 b数组里。
// 接下来就用到KMP思想啦,定义getp()函数,用getp函数处理数组b.
//本题主要利用getp()函数的性质:
//[1]若 len%(len-p[len])等于0,那么这列字符串一定是周期串(就像循环小数)
//[2]并且它的循环节的长度是 len-p[len],循环的次数是 len/(len-p[len]); 
//len:getp函数要处理的字符串的长度。 
#include<stdio.h>
#include<string.h>
char a[220],b[220];
int p[100];
int len1,len2,length,cnt=0,k;
void getp(){
	int i=0,j=-1;
	 p[i]=j;
	while(i<len2){
		if(j==-1||b[i]==b[j]){
			i++,j++;
			p[i]=j;
		}
		else
		 j=p[j];
	}	
}
int main()
{
	int j,f;
	while(scanf("%s",a)!=EOF){
		memset(b,0,sizeof(b));
		cnt=0;length=1;len2=0;
		len1=strlen(a);k=0;
		for(j=0;j<len1;j++){
		   if(a[j]=='.')
			{ k=j+1;break;}
			}
		for(j=0;k<len1;k++,j++)
		  b[j]=a[k];
		len2=strlen(b);
		getp();
		length=len2-p[len2];
		cnt=len2/(length);
		printf("%d ",length);
		for(j=0;j<length;j++)
		  printf("%c",b[j]);
		printf(" ");
		printf("%d\n",cnt);
	}
	return 0;
 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: