循环数题目讲解

题目

描述

若一个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 函数判断该数字串是否为循环数,并将结果输出到控制台。

通过以上代码,我们就可以根据题目要求准确地判断输入的数字串是否为循环数了。

若有错误,请在评论区指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值