循环节及周期

#include<stdio.h>
#include<string.h>
int main()
{
    int n,i,k,m,j,x,t;
    char s[85];
    scanf("%d",&n);
    for(k=1;k<=n;k++)
    {
        memset(s,'\0',sizeof(s));
        scanf("%s",s);
        m=strlen(s)-1;
        for(i=0;i<=m;i++)
        {
            for(x=1,j=0,t=i+1;t<=m;t++)
            {
                if(s[t]==s[j])j++;
                else {
                        x=0;break;
                }
                if(j==i+1)j=0;
            }
            if(x==1&&j==0){
                printf("%d\n",i+1);break;
            }
        }
        if(k!=n)printf("\n");
    }
	return 0;
}


求循环节和周期的问题已经是第二次或第三次碰到了,但是还是在细节上有点小问题,如果做过的题目不能正确快速的写完的话,那刷题意义也将减半。

这道题其实就是暴力,应该是简单暴力,遍历全部元素,考察已确定长度是否为周期,是否足够构成循环节,应考虑到各种情况。

从这道题中也可以发现一些问题,值得去学习的:

1.不应该使用过于繁琐的办法:再开一个数组,把选中的循环节部分放进去,再将两个数组进行比较,重复这种操作,也不应该开一个变量计数周期。这些都是增加代码复杂度,增加编程时间,应当注意到其实只需要利用同一个数组,开一个变量j圈进s中开头的长度作为循环节长度(其实差1)循环内让后面的部分与已圈进的部分进行遍历,看是否构成循环,即有无不同项存在,如果是循环成立的话,循环节与后面部分应构成重复相等,而不会执行到else中跳出遍历,但多数情况总会执行else,注意j每次大于i后就需要归0,从头在此循环循环节。

2.注意特例:abababa(此时循环节未判断出错,但循环节并未执行完,循环是不完整的,即j!=0,若循环节我是完整的,则我循环节应该是判断完,归为0的),abcabcabcabf,aabcfaaabcfa(这种出现了不能把循环节直接跳到出错位置的情况,若直接跳到出错位置,此时循环节会在扩大为aabcf后直接扩展到aabcfaaa循环节就错了,导致所以结果均出错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值