题目
描述
若一个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
以下是对这道 C++ 题目实现判断给定数字串是否为循环数的详细讲解:
1. 解题思路
- 首先,我们需要读取输入的数字串。
- 然后,根据数字串的长度
n
,我们要依次用1
到n
去乘以这个数字串所对应的整数(忽略前导 0 转换而来),并检查得到的结果是否符合循环数的定义,即是否是原数字串首尾相接后在某处断开得到的新数字串所对应的整数。 - 如果对于所有的
1
到n
的乘法运算结果都满足循环数的条件,那么该数字串就是循环数,输出1
;否则,输出0
。
2. 代码实现如下:
#include <iostream>
#include <string>
#include <sstream>
// 函数用于将数字串转换为整数(忽略前导0)
long long stringToInt(const std::string& numStr) {
std::istringstream iss(numStr);
long long num;
iss >> num;
return num;
}
// 函数用于检查数字串是否为循环数
int isCyclic(const std::string& numStr) {
int n = numStr.length();
long long num = stringToInt(numStr);
for (int i = 1; i <= n; ++i) {
long long product = num * i;
std::string productStr = std::to_string(product);
// 如果乘积的长度不等于原数字串长度,肯定不是循环数
if (productStr.length()!= n) {
return 0;
}
// 将原数字串复制两份,用于模拟首尾相接的情况
std::string doubledNumStr = numStr + numStr;
// 检查乘积对应的数字串是否能在复制后的数字串中找到
if (doubledNumStr.find(productStr) == std::string::npos) {
return 0;
}
}
return 1;
}
int main() {
std::string numStr;
std::cin >> numStr;
std::cout << isCyclic(numStr) << std::endl;
return 0;
}
3. 代码讲解
(1)stringToInt
函数
- 这个函数的作用是将输入的数字串转换为整数类型。它通过创建一个
istringstream
对象,将数字串作为输入流,然后利用流提取运算符>>
将数字串解析为整数并返回。在这个过程中,会自动忽略前导 0。
(2)isCyclic
函数
- 首先,获取输入数字串的长度
n
,并通过调用stringToInt
函数将数字串转换为整数num
。 - 然后,使用一个循环从
1
到n
依次进行乘法运算。对于每次乘法:- 计算
num
与i
的乘积product
,并将其转换为数字串productStr
。 - 首先检查乘积的数字串长度是否与原数字串长度相等,如果不相等,那么肯定不符合循环数的定义,直接返回
0
。 - 接着,通过将原数字串复制两份得到
doubledNumStr
,模拟了原数字串首尾相接的情况。然后使用find
函数检查乘积对应的数字串productStr
是否能在doubledNumStr
中找到,如果找不到,也不符合循环数的定义,返回0
。
- 计算
- 如果循环结束后都没有返回
0
,说明对于所有的乘法运算结果都满足循环数的条件,那么该数字串就是循环数,返回1
。
(3)main
函数
- 在
main
函数中,首先读取输入的数字串numStr
。 - 然后调用
isCyclic
函数判断该数字串是否为循环数,并将结果输出到控制台。
通过以上代码,我们就可以根据题目要求准确地判断输入的数字串是否为循环数了。
若有错误,请在评论区指出!