样例分析:1、a = “abcd”
2、a = “a”
3、a = “ab”
直接循环:使串a的长度i从1增加到输入字符串长度的一半(若i不能整除n则不需要考虑),对于每一个需要考虑的i,再进行单独判断是否满足要求即可。
代码如下:
# include "stdio.h"
# include "string.h"
char s[1000005];
int judge(char s[], int l, int i);
int main()
{
int i = 1;
while (1)
{
gets(s);
int l = strlen(s);
if (l == 1 && s[0] == '.')
break;
while (i <= l / 2)
{
if (l % i == 0)
{
if (judge(s,l,i))
{
printf("%d\n",l / i);
break;
}
else
i++;
}
else
i++;
}
if (i > l / 2)
printf("1\n");
i = 1;
}
return 0;
}
int judge(char s[], int l, int i)
{
char *p1 = s;
int j = i,k;
for (k=0;k<j;k++)
{
while (i < l)
{
if (*(p1 + k) != *(p1 + k + i))
return 0;
i += j;
}
i = j;
}
return 1;
}
当然也可以用kmp算法来解决,时间效率更高。不过不太好理解。
KMP处理方法:
比如说aaaaa:显然a = “a”,且next[5] = 4,所以串a的长为len - next[len] = 5 - 4 = 1;
再比如abababab:a = “ab”,len = 8,next[8] = 6,串a长度为len - next[len] = 8 - 6 = 2;
next介绍