【题目】
如果某个字符串可以由长度为k的字符串重复多次得到,则称该串以k为周期。
输入一个长度不超过80的字符串,输出最小周期。
【思路】
暴力求解。依次考察周期1~长度n。
筛选:周期一定是长度n的约数。n%i == 0
考察形式:周期为i,比较后面的每个周期位置和i周期之内的是否一一相等。
a[j]==a[j%i]? //后者为周期内的值
【代码】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int maxn = 85;
char a[maxn];
int main()
{
memset(a,0,sizeof(a));
scanf("%s",a);
int n = strlen(a);
int flag = 1;
printf("%s
",a);
printf("%d
",n);
for (int i = 1; i <= n; i++) //考察所有小于长度的数i是否可能是周期
{
//字符串长度一定是周期的倍数
//printf("1 %d
",flag);
if(n%i != 0) flag = 0;
else
{
for (int j = i; j < n; j++)
{
if(a[j]!=a[j%i]) flag = 0; break; //这里可以加上可以提高效率
}
}
//如果循环了一遍还有的话
//printf("2 %d
",flag);
if(flag)
{
printf("min period %d", i);
break;
}
else
{
printf("not periodic
");
}
flag = 1;
}
system("pause");
}