SDUT 循环节
Time Limit: 1ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
X最近爱上了一种奇怪的游戏,就是找出一个字符串中的最小循环节。
对于最小循环节的定义:对于字符串A存在字串B,使得A是由N个完整的B组成的,那么B就是A的一个循环节,长度最小的那一个为最小循环节。
输入
多组输入。
每组输入一个字符串,长度不大于80,只包含26个小写字母。
输出
输出一个字符串,代表最小循环节。
示例输入
aaaa abab
示例输出
a ab
在汝可佳的书中找到:(可读性强)
#include <stdio.h>
#include <string.h>
int main()
{
char s[100];
int len;
while(scanf("%s", s)!=EOF)
{
len = strlen(s);//长度
for(int i=1; i<=len; i++)
if(len%i==0)//看看当是倍数的时候
{
{
int ok = 1;
for(int j=i; j<len; j++)
{
if( s[j] != s[j%i] )//从第二份有可能出现循环的地方查(0,i)这个区间是否与其完全匹配。
{
ok = 0;
break;
}
}
if(ok!=0)
{
printf("%d\n", i);//打印出循环节长度
for(int k=0; k<i; k++)//打印出循环节
{
printf("%c", s[k] );
}
printf("\n");
break;
}
}
}
}
return 0;
}