循环节及周期

来源:互联网 发布:mac foobar2000 编辑:程序博客网 时间:2024/05/17 02:07
#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循环节就错了,导致所以结果均出错)

0 0
原创粉丝点击