UVa 455 - Periodic Strings(字符串处理)

今天帮人Debug,实在看不懂他写的什么,就重写了一份给他。感觉学了这么久之后,再写这种水题轻松加随意,写得也比之前的好了。

代码如下:

#include<stdio.h>
#include<string.h>
int t;
char s[90];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%s",s);
        int i,n=(int)strlen(s);
        for(i=1;i<n;++i){
            if(n%i) continue;
            int ok=1,j=0,k=0;
            for(;j<n&&ok;k%=i)
                if(s[j++]!=s[k++]) ok=0;
            if(ok) break;
        }
        printf("%d\n",i);
        if(t) printf("\n");
    }
    return 0;
}


从昨天晚上开始做的,今天终于Ac了。题目是让输出输入的字符串的最小周期。开始使用了数组,当字符长度为n时,i从n-1开始自减,n%i=0时,建立数组a[ i ][ n/i ];判断数组中对应值是否相等来输出i。可总是出问题,于是后来放弃数组,改为用j%i表示昨天数组中对应的值,并且使用x,y两个变量来限制多余的循环,提交一次就Ac了。

#include <stdio.h>
#include <string.h>
#define maxn 100
int main()
{
    int T,n,i,j,x,y;
    scanf("%d",&T);
    char s[maxn];
    while(T--)
    {
        y=0;
        scanf("%s",s);
        n=strlen(s);
        for(i=1;i<=n;i++)
        {
            if(n%i==0)
            {
                x=1;
                for(j=i;j<n;j++)
                {
                    if(x==0)
                        break;
                    if(s[j]!=s[j%i])
                        x=0;
                }
                if(x)
                    y=i;
            }
            if(y)
                break;
        }
        if(T)
            printf("%d\n\n",y);
        else
            printf("%d\n",y);
    }
    return 0;
}



你可能感兴趣的:(uva)