1 条题解
-
0
题目分析
循环数是指一个位整数,当它乘以到之间的任意整数时,结果都是原数的一个循环排列。例如,是循环数,因为它乘以到的结果都是其自身数字的循环排列。判断一个数是否为循环数需要验证所有乘积是否满足循环排列的条件。
算法标签
字符串处理:通过字符串操作判断循环排列。 模拟:模拟乘法运算并检查结果。 枚举:遍历所有可能的乘数(从1到n)。
解题思路
输入处理:读取每个输入的数字字符串,包括前导零,确定其位数n。 生成循环排列集合:将原数的所有可能循环排列存入集合中,以便快速查询。 验证每个乘数:对于每个k(),计算原数乘以k的结果,并检查该结果是否为原数的循环排列。 输出结果:若所有乘积均满足条件,则输出 "is cyclic",否则输出 "is not cyclic"。
代码实现
#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; }
- 1
信息
- ID
- 48
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者