测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A50512. 循环数

填空题 困难

题目描述

循环数

题目描述

循环数是n位长度的整数,当乘以从1到n的任何整数时,产生原始数字的“循环”。也就是说,如果考虑最后一个数字之后的数字“绕”回到第一个数字,两个数字中的数字序列将是相同的,尽管它们可能从不同的位置开始。例如,数字142857是循环的,如下表所示: 

    142857 *1 = 142857

    142857 *2 = 285714

    142857 *3 = 428571

    142857 *4 = 571428

    142857 *5 = 714285

    142857 *6 = 857142 

编写一个程序来确定数字是否是循环数。

1

2

3

4

5

6

7

8

9

10

输入形式

输入一个数,长度在2到60位之间(请注意,前面的零不应该被删除,它们被认为是确定n的大小和计数的一部分,因此,“01”是一个两位数的数字,与“1”是一个一位数的数字不同。) 。

1

输出形式

对于每个输入,输出一行(Yes或No)标识它是否是循环数。 

1

样例输入

142857

样例输出

Yes

参考答案

#include <bits/stdc++.h> using namespace std; set<string> strs; string shift(string str,int n){ string newStr; newStr = str.substr(str.size() - n, n) + str.substr(0, str.size() - n); return newStr; } string multiplication(string str,int n){ char ans[62]; int num = 0; int carry = 0; for(int i = str.size() - 1; i >= 0; i--){ int temp = (str[i] - '0') * n; ans[num++] = (temp + carry) % 10 + '0'; carry = (temp + carry) / 10; } if(carry != 0){ ans[num++] = carry + '0'; } ans[num] = '\0'; for(int i = 0; i < num / 2; i++){ char t = ans[i]; ans[i] = ans[num - 1 - i]; ans[num - 1 - i] = t; } string newStr = ans; return newStr; } int main(){ string a; cin >> a; for(int i = 0; i < a.size(); ++i){ string temp = shift(a, i); strs.insert(temp); } bool flag = true; for(int i = 1; i <= a.size(); ++i){ string temp = multiplication(a, i); if(strs.count(temp) == 0){ flag = false; break; } } if(flag) cout << "Yes" << endl; else cout << "No" << endl; return 0; }
上一题 下一题