UVA - 455
Description
A character string is said to have period k if it can be formed by concatenating one or more repetitions of another string of length k. For example, the string "abcabcabcabc" has period 3, since it is formed by 4 repetitions of the string "abc". It also has periods 6 (two repetitions of "abcabc") and 12 (one repetition of "abcabcabcabc"). Write a program to read a character string and determine its smallest period. InputThe first line oif the input file will contain a single integer N indicating how many test case that your program will test followed by a blank line. Each test case will contain a single character string of up to 80 non-blank characters. Two consecutive input will separated by a blank line. OutputAn integer denoting the smallest period of the input string for each input. Two consecutive output are separated by a blank line. Sample Input1 HoHoHo Sample Output2 |
写一下感想吧
实际上这个题是十分简单的 因为数据比较小所以 我们开始从1 假设 该周期 现在 假设该周期 为 i 字符串的长度 为 l 最外面的 一层循环代表的 用 i为变量 里面的 再来一层循环 分别 按照周期为 i 进行对整个字符串的比较 按照固定的距离 进行 一个个单词的对比 如果只是这样的话 那么就有麻烦了 例如 输入的是 aba 这时候 程序判定循环的周期是 2 很明显 因为 b 没有 对照 周期是一定可以 整除 字符串长度的 所以 设置 一个 关卡 就是 必须让周期可以整除 字符串长度 当整除字符串 长度的时候 就鞥做到每个单词一一进行比较的 效果了 .
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[100]; 6 int i,j,m,n,l; 7 scanf("%d",&n); 8 while(n) 9 { 10 scanf("%s",a); //一会 试试 gets 这样的话 还能避免万一有空格的陷阱 11 l=strlen(a); 12 for(i=1;i<=l;i++) // i 代表 最小循环节 13 { 14 if(l%i!=0) 15 continue; 16 for(j=0;j+i<l;j++) 17 { 18 if(a[j]!=a[j+i]) 19 break; 20 } 21 if(j+i==l) 22 { 23 printf("%d ",i); 24 if(n!=1) 25 printf(" "); 26 break; 27 } 28 } 29 n--; 30 } 31 }