总时间限制:
1000ms
内存限制:
65536kB
描述
若一个n位的数字串满足下述条件,则称其是循环数(cyclic):将这个数字串视为整数(可能带有前导0),并用任意一个 1 到 n 之间(包含1和n)的整数去乘它时, 会得到一个将原数字串首尾相接后,再在某处断开而得到的新数字串所对应的整数。例如,数字 142857 是循环数,因为:
142857 *1 = 142857
142857 *2 = 285714
142857 *3 = 428571
142857 *4 = 571428
142857 *5 = 714285
142857 *6 = 857142。
请写一个程序判断给定的数是否是循环数。
注意:在此题中,输入数字串允许带前导0,且前导0不能被忽略,例如“01”是两位数字串,而“1”是一位数字串。但将数字串转化为整数做乘法运算或比较运算时,可以忽略前导0。
输入
一行,一个长度在 2 到 60 位之间的数字串。
输出
一个整数,若输入的数字串是循环数,输出1,否则输出0。
样例输入
142857
样例输出
1
为了方便大家检查,我百度了一下循环数:
以下这些数比如是循环数;
1、单独的一位数,如5
2、单位重复的数,如555
3、循环数的重复,如142857
如果前导0不被允许,142857将是唯一一个十进制循环数。如果允许前导0,前几个循环数是:
142857 (6位)
0588235294117647 (16位)
052631578947368421 (18位)
0434782608695652173913 (22位)
0344827586206896551724137931 (28位)
0212765957446808510638297872340425531914893617 (46位)
0169491525423728813559322033898305084745762711864406779661 (58位)
016393442622950819672131147540983606557377049180327868852459 (60位)
我自己的代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
char s[122],s1[122]; //s为输入字符串,s1=s+s
int len,l;
int chen(int n)
{
int i,a[122]={0},j,lm,k;
for(i=0;i<l;i++) //大整数相乘
{
a[i]+=(s[i]-'0')*n;
if(a[i]>=10)
{
int t=floor(a[i]/10)*10;
a[i]-=t;
a[i+1]+=t/10;
}
}
while(a[i+1]!=0) //判断此时数组a里面的数有几位
{
i++;
}
lm=i; //lm为 位数
for(i=0;i<lm/2;i++) //翻转a
{
int te;
te=a[i];a[i]=a[l-i-1];a[l-i-1]=te;
}
for(i=0;i<=len-lm;i++) //判断a是否是循环
{
k=i;
for(j=0;j<lm;j++)
{
if(a[j]==s1[k]-'0')
{
k++;
}
else break;
}
if(j==lm) return 1;
}
return 0;
}
int main()
{
int i,j,k;
scanf("%s",s); //读入字符串
strcpy(s1,s);strcat(s1,s); //先s1=s后s1连接s
len=2*strlen(s); //计算s1的长度len=2*l
l=strlen(s);
for(i=0;i<l/2;i++) //将s前后翻转以便后续操作
{
char te;
te=s[i];s[i]=s[l-i-1];s[l-i-1]=te;
}
for(k=1;k<=len/2;k++)
{
if(!chen(k)) //通过chen()函数判断s每次乘1,2,3。。。l后是否 满足条件
{
printf("0"); //不满足直接结束
return 0;
}
}
printf("1");
return 0;
}
希望可以帮助大家。