题目没什么难度,主要是两个要点,一是长整数的乘法,二是循环数组比对,都是比较简单的。
唯一想骂娘的地方在于,,,输入没有终止标志,这让我纠结了好一阵子,最后百度才知道可以下面这么搞,涨姿势了又
while (cin>>temp)
{
<span style="white-space:pre"> </span>.....
}
下面是代码,写得比较粗犷没有优化。。。
#include <iostream>
using namespace std;
bool comp (unsigned char a[], unsigned char b[], unsigned char len)
{
unsigned char aii = 0, bii = 0;
while (aii < len)
{
if (a[aii] == b[bii])
{
aii++;
bii++;
}
else if (aii == 0)
{
bii++;
}
else if (aii<=bii)
{
aii = 0;
}
else
{
return false;
}
if (bii == len && aii != 0)
{
bii = 0;
}
else if (bii == len && aii == 0)
{
return false;
}
}
return true;
}
bool multip (unsigned char a[], unsigned char len, unsigned char b)
{
unsigned char a0[60] = {0};
unsigned char temp = 0;
unsigned char addi = 0;
unsigned char b1 = b/10, b0 = b%10;
for (int i=len; i>0; i--)
{
temp = a[i-1]*b0+addi;
a0[i-1] = temp%10;
addi = temp/10;
}
if (b1>0)
{
addi = 0;
for (int i=len; i>1; i--)
{
temp = a[i-1]*b1+addi;
a0[i-2] += temp%10;
addi = temp/10+a0[i-2]/10;
a0[i-2] = a0[i-2]%10;
}
}
return comp(a,a0,len);
}
int main ()
{
unsigned char *a = new unsigned char[62];
unsigned char *a_raw = new unsigned char[62];
unsigned char len = 0;
while (cin>>a_raw)
{
len = 0;
while (a_raw[len]!=0)
{
a[len] = a_raw[len]-48;
len ++;
}
if (len==0)
{
break;
}
int i;
for (i=1; i<=len; i++)
{
if (multip(a, len, i)==false)
{
cout<<a_raw<<" is not cyclic"<<endl;
break;
}
}
if (i==len+1)
{
cout<<a_raw<<" is cyclic"<<endl;
}
}
return 0;
}