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

使用了周期函数原理的别人家的代码——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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值