C语言中如何判断一个数是否为周期数字,如:123123,12341234,123123123
没有现成的函数给你用,所以要自己想办法写程序来实现。
暴力求解一下可以吗?我不知道有很快的算法可以解决!
用特征向量去判断,不过要自己实现。
转换成字符串,用最长公共子串(LCS)算法。
可以证明的是,一个周期循环的字符串,必然它的周期是最长公共子串。有了周期,从头开始逐一比较每一段是不是这个串就可以了。
//返回循环个数
int getloop(int nin)
{
int nlen = 0, kmax = 1;
for (kmax = 1; kmax <= nin; kmax = 10){
nlen++;
}
for (int i = 1; i <= nlen / 2; i++){
if (nlen %i)continue;
int j = _Pow_int(10, i);
int k = (nin % j)(kmax/j);
if (nin - nin/j == k)
return i;
}
return 0;
}
// 为啥 刚才 * 丢了
int getloop(int nin)
{
int nlen = 0, kmax = 1;
for (kmax = 1; kmax <= nin; kmax = kmax * 10){ //
nlen++;
}
for (int i = 1; i <= nlen / 2; i++){
if (nlen %i)continue;
int j = _Pow_int(10, i);
int k = (nin % j) * (kmax/j);
if (nin - nin/j == k)
return i;
}
return 0;
}
最长公共子串(LCS)
#include
#include
#include
using namespace std;
const int maxn=1000005;
int next[maxn];
char str[maxn];
void getnext(int s)
{
int i;
int j=0;
next[1]=0;
for(i=2;i<=s;i++)
{
while(j>0&&str[j+1]!=str[i])
j=next[j];
if(str[j+1]==str[i])
j++;
next[i]=j;
}
}
int main()
{
scanf("%s",&str[1]);
int chang=strlen(&str[1]);
getnext(chang);
int ans;
if(chang%(chang-next[chang])==0&&chang-next[chang]!=chang)
{
ans=chang/(chang-next[chang]);
printf("最大循环节为:%d\n",ans);
for(int i=1;i<1+chang/ans;i++)
printf("%c",str[i]);
printf("\n");
}
else
printf("不是周期数字\n");
return 0;
}