A:
问题 A: 一道签到题
时间限制: 2 Sec 内存限制: 128 MB提交: 63 解决: 28
[ 提交][ 状态][ 讨论版]
题目描述
我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数、循环节以及循环节长度
输入
输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100
输出
分别输出这个小数的循环节的长度、循环节以及循环次数,中间以一个空格间隔
样例输入
8.6987698769876987 0.666 5.1
样例输出
4 6987 4 1 6 3 1 1 1
我用的KMP
#include<cstdio>
#include<cstring>
char s[220],t[220];
int lens,lent,next[220];
void getnext()
{
int i=0,j=-1;
next[i]=j;
while(i<lent)
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
while(~scanf("%s",s))
{
memset(t,0,sizeof(t));
lens=strlen(s);
int i=0;
while(s[i]!='.')
i++;
i++;
for(int j=0;i<lens;++j,++i)
t[j]=s[i];
lent=strlen(t);
getnext();
int ans=1;
if(lent%(lent-next[lent])==0)
ans=lent/(lent-next[lent]);
int d=lent/ans;
printf("%d ",d);
for(int i=0;i<d;++i)
printf("%c",t[i]);
printf(" %d\n",ans);
// for(int i=0;i<=lent;++i)
// printf("%d ",next[i]);
// printf("\n");
}
return 0;
}