问题链接:UVA455 Periodic Strings。入门练习题,用C语言编写程序。
题意:如果一个串可以由长度为k的字符串重复多次连接而得到,则称该串为k周期。本题求一个串的最小周期。
程序中,封装了一个函数strcmplen()用于比较相同串的两个指定长度的子串,使得主函数的逻辑变得简单。
另外,输出格式上需要注意。题中有“Two consecutive output are separated by a blank line.”,需要小心处理。
AC的C语言程序如下:
/* UVA455 Periodic Strings */ #include <stdio.h> #include <string.h> #define MAXN 80 int strcmplen(char a[], int s, int t, int len) { int i; for(i=1; i<=len; i++) { if(a[s] != a[t]) return a[s] - a[t]; s++; t++; } return 0; } int main(void) { int n, len, i, j; char s[MAXN+1]; scanf("%d", &n); while(n--) { scanf("%s", s); len = strlen(s); for(i=1; i<len; i++) { if(len % i) continue; for(j=i; j<len; j+=i) if(strcmplen(s, 0, j, i) != 0) break; if(j == len) break; } printf("%d ", i); if(n) printf(" "); } return 0; }