nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】

循环小数

时间限制:3000 ms  |  内存限制:65535 KB

难度:1

描述

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

输入
输入的第一行是t,表示有t组测试数据(t<=100)。
随后的t行,每行都是一个小于10并且大于0的小数(总长度<=200)。
输出
对每组输入,输出结果单独成行,输出最小循环体的长度、循环体和出现循环的次数。
样例输入
3
8.6987698769876987
0.666
5.1
样例输出
4 6987 4
1 6 3
1 1 1

看算法看的头疼,水一道
#include<stdio.h>
#include<string.h>
int f[210];
int len,len1;
char str[210],s[210];
char put[210];
void getmap()
{
	int i,j,k;
	memset(s,‘\0‘,sizeof(s));
	scanf("%s",str);
	len=strlen(str);
	for(i=0;i<len;i++)
	{
		if(str[i]==‘.‘)
		{
			k=i;
			break;
		}
	}
	j=0;
	for(i=k+1;i<len;i++)
		s[j++]=str[i];
	len1=strlen(s);
}
void getfail()
{
	int i,j;
	f[0]=f[1]=0;
	for(i=1;i<len1;i++)
	{
		j=f[i];
		while(j&&s[i]!=s[j])
		    j=f[j];
		f[i+1]=s[i]==s[j]?j+1:0;
	}
}
void kmp()
{
	int i,j,length,times;
	int k;
	length=len1-f[len1];
	times=len1/(len1-f[len1]);
	j=0;
	for(i=0;i<len1;i++)
	{
		while(j&&s[i]!=s[j])
		    j=f[j];
		if(s[i]==s[j])
		    j++;
		if(j==length)
		{
			k=i-length+1;//循环体出现位置
			break;
		}
	}
	memset(put,‘\0‘,sizeof(put));
	j=0;
	for(i=k;i<length;i++)
	    put[j++]=s[i];
	printf("%d %s %d\n",length,put,times);
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		getmap();
		getfail();
		kmp();
	}
	return 0;
}

  

时间: 2024-10-19 00:40:16

nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】的相关文章

KMP + 求最小循环节 --- POJ 2406 Power Strings

Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少次得到. analyse: KMP之next数组的运用.裸的求最小循环节. Time complexity: O(N) Source code:  /** this code is made by crazyacking* Verdict: Accepted* Submission Date: 20

模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace

Cyclic Nacklace Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3746 Mean: 给你一个字符串,让你在后面加尽量少的字符,使得这个字符串成为一个重复串. 例: abca---添加bc,成为abcabc abcd---添加abcd,成为abcdabcd aa---无需添加 analyse: 经典的求最小循环节. 首先给出结论:一个字符串的最小循环节为:len-next[len]. 证明: 举个例子:abcab

KMP + 求最小循环节 --- HDU 1358 Period

Period Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1358 Mean: 给你一个字符串,让你从第二个字符开始判断当前长度的字符串是否是重复串,如果是,输出当前位置,并输出重复串的周期. analyse: 还是next数组的运用,详见上一篇博客. Time complexity: O(N) Source code:  /** this code is made by crazyacking* Verdict: Acce

poj 1961 Period【求前缀的长度,以及其中最小循环节的循环次数】

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 14653   Accepted: 6965 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the

求循环小数的表示以及循环节长度

问题: 输入整数a和b,输出a/b的循环小数表示以及其循环节长度.例如 a=5 b=43 小数表示为0.(116279069767441860465),循环节长度为21: 分析: 长除法的计算过程 ①mod = a%b: ②小数 = (mod*10) / b: ③mod = (mod*10)%b: 循环②③步,当出现重复的余数的时候,也就是循环节出现了 注意事项: 当循环上述2.3步骤时,出现余数为零的情况,即计算结果不是循环小数时,直接输出索引值,循环节长度为0. C++实现: 1 #incl

(KMP 1.5)hdu 1358 Period(使用next数组来求最小循环节——求到第i个字符的循环节数)

题目: Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3813    Accepted Submission(s): 1862 Problem Description For each prefix of a given string S with N characters (each character has an A

poj2406 kmp 求最小循环字串

Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 47748   Accepted: 19902 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "

KMP解决字符串最小循环节相关问题

经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个结论 如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且 循环节长度为:    i - next[i] 循环次数为:       i / ( i - next[i] ) 水平有限,用自己的语言描述怕

Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)

参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html 总结一下,如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且 循环节长度为:   i - next[i] 循环次数为:       i / ( i - next[i] ) 1 #include <iostream> 2 #include <cstdi