天天看点

周期串

#include <stdio.h>

#include <string.h>

int main()

{

 char word[100];int ok=0;

 scanf("%s",word);

 int l=strlen(word);

 for (int i=1; i<=l; ++i)//周期必是1到l,若为1,即是常数串

 {

  if (l%i==0)//最小周期必是长度的约数

  {

   int ok=1;

   for (int j=i; j<l; ++j)

   {

    if (word[j%i]!=word[j])//个人认为j-

//word[j]为第二周期的第一个字符,word[j%i]是前一个周期的第一个字符(因为

//j=i;j%i=0;j每加1,j%i也加1,直到最后一组word[j]都等于word[j%i],则i为周期

     {

      ok=0;

      break;

     }

   }

   if (ok)

    printf("%d\n",i);

    break;// this is the least cycle

  }

  else

   continue;

 }

 return 0;

}

上述代码,无MMP时输出了长度

#include<stdlib.h>

char word[100];

scanf("%s",word);

int l=strlen(word);

for (int i=1; i<=l; ++i)//周期必是1到l,若为1,即是常数串

//加上等号时,最小正周期为长度

if (l%i==0)//最小周期必是长度的约数

int ok=1;

for (int j=i; j<l; ++j)

if (word[j%i]!=word[j])//个人认为j-1亦可

ok=0;

break;

if (ok&&i!=l)

printf("%d\n",i);

break;// this is the least cycle

else if(i==l)

printf("No MMP\n");

system("pause");

return 0;

作者:火星十一郎

出处:javascript:void(0)

本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

分享到:

更多