【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串

【题目】
如果某个字符串可以由长度为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");
}


原文地址:https://www.cnblogs.com/kinologic/p/13952781.html