您的位置:首页 > 其它

一道签到题

2015-08-08 17:43 190 查看

问题 A: 一道签到题

时间限制: 2 Sec  内存限制: 128 MB
提交: 68  解决: 32

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

题目描述

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

输入

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

输出

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

样例输入

8.6987698769876987
0.666
5.1


样例输出

4 6987 4
1 6 3
1 1 1


 
 
 
 
可以暴力解,也能套kmp模板,多记俩公式。
公式原理在:http://blog.csdn.net/kflcg/article/details/47340629
 
 
 
 
 
代码:
#include<stdio.h>
#include<string.h>
char str[300];
int len,p[300];
void getp()
{
int i=0,j=-1;
p[0]=j;
while(i<len)
{
if(j==-1||str[i]==str[j])
{
i++;j++;
p[i]=j;
}
else{
j=p[j];
}
}
if(i%(i-p[i])==0&&p[i]!=0)//判断有无循环(其实本体确定有循环的)
{
printf("%d ",i-p[i]);//循环节长度公式
for(int k=0;k<i-p[i];k++)
printf("%c",str[k]);//输出循环节
printf(" %d\n",i/(i-p[i]));//循环次数
}
else
{
printf("%d ",len);
for(int k=0;k<len;k++)
printf("%c",str[k]);
printf(" 1\n");
}
}

int main()
{
int d;
while(scanf("%d",&d)!=EOF)//第一位是整数部分,没用,拿来判断是否文件结束
{
char x;
while(scanf("%c",&x),x!='.');//吸收小数点及以前的整数部分,剩下的存字符数组
scanf("%s",str);
len=strlen(str);
getp();
}
return 0;
}


 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp 算法