您的位置:首页 > 其它

还我两百万—— 算法提高 周期字串

2018-01-29 15:38 295 查看
使用了周期函数原理的别人家的代码——http://blog.csdn.net/qq_25605637/article/details/50835144

最后满分提交通过的版本:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<math.h>

int main()

{
int len,i,k;
char a[105],sample[105],compare[105];
gets(a);
len=strlen(a);
if(len%2==1)//奇数
{
for(i=1;i<=len;i+=2)
{
if(len%i!=0) continue;
memset(sample,'\0',105*sizeof(char));
strncpy(sample,a,i);
for(k=i;k<=len-i;k+=i)
{
memset(compare,'\0',105*sizeof(char));
strncpy(compare,a+k,i);
if(strcmp(compare,sample)) break;
}
if(k==len)
{
printf("%d",i);
return 0;
}
}

else
{
for(i=1;i<=len;i++)
{
if(len%i!=0) continue;
memset(sample,'\0',105*sizeof(char));
strncpy(sample,a,i);
for(k=i;k<=len-i;k+=i)
{
memset(compare,'\0',105*sizeof(char));
strncpy(compare,a+k,i);
if(strcmp(compare,sample)) break;
}
if(k==len)
{
printf("%d",i);
return 0;
}
}
}

return 0;

}

历史版本:(错误的来源)

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<math.h>
int prime(int n)

{
int j;
for(j=2;j*j<=n;j++)
{
if(n%j==0) return 0;
}
return 1;

}//如果是aaaaaaa呢,最短周期明显是1,而不是len。

int main()

{
int len,i,k;
char a[105],sample[105],compare[105];
gets(a);
len=strlen(a);
if(prime(len)||len==1) 
{
printf("%d",len);
return 0;
}
else/*分为奇数和偶数,能稍微减少一点计算量,但这是战术层面的,不是战略层面的;战略层面的详见
http://blog.csdn.net/qq_25605637/article/details/50835144*/ {
if(len%2==1)

/*一开始以为少了十分是因为上面的错误,结果却是——奇数部分忘记加了memset,偶数部分倒是加了,所以使用字符串函数的时候一定要注意'\0'结束符(手动设置或者使用memset)*/

{
for(i=1;i<=len;i+=2)
{
if(len%i!=0) continue;
strncpy(sample,a,i);
for(k=i;k<=len-i;k+=i)
{
strncpy(compare,a+k,i);
if(strcmp(compare,sample)) break;
}
if(k==len)
{
printf("%d",i);
return 0;
}
}

else
{
for(i=1;i<=len;i++)
{
if(len%i!=0) continue;
memset(sample,'\0',105*sizeof(char));
strncpy(sample,a,i);
for(k=i;k<=len-i;k+=i)
{
memset(compare,'\0',105*sizeof(char));
strncpy(compare,a+k,i);
if(strcmp(compare,sample)) break;
}
if(k==len)
{
printf("%d",i);
return 0;
}
}
}
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息