c++求助!循环数

来源:百度知道 编辑:UC知道 时间:2024/05/18 17:27:37
Description
n 位的一个整数是循环数(cyclic)的条件是:当用一个 1 到 n 之间的整数去乘它时, 会得到一个将原来的数首尾相接循环移动若干数字再在某处断开而得到的数字。也就是说,如果把原来的数字和新的数字都首尾相接,他们得到的环是相同的。只是两个数的起始数字不一定相同。例如,数字 142857 是循环数,因为:
142857 *1 = 142857
142857 *2 = 285714
142857 *3 = 428571
142857 *4 = 571428
142857 *5 = 714285
142857 *6 = 857142

Input
写一个程序确定给定的数是否是循环数。输入包括多个长度为 2 位到 60 位的整数。(注意,先导的0也是合理的输入不应该被忽略,例如 "01"是 2 位数,"1" 是 1 位数。)
Output
对于每一个输入的整数,输出一行表明它是否是循环数。
Sample Input
142857
142856
142858
01
0588235294117647

Sample Output
142857 is cyclic
142856 is not cyclic
142858 is not cyclic
01 is not cyclic
0588235294117647 is cyclic

给出解题思路 最好能给出程序
谢谢!

C++我好久没用过了,所以不大可能给你程序。我用AS3帮你实现了一下,大致思路如下:
1. 将输入数字P转换成字符串,然后用字符串方法获取这个数字的长度n
2. 将输入数字P的每一位数字存到一个数组里面,并按照从小到大排序(AS3有个方法可以一步到位,不知道C++有没有数组排序的方法),然后把排序后数组输出字符串One
3. 定义一个布尔型变量flag,且flag=true
4. 写一个for循环,自变量为i,其中1=<i<=n,步长为1;
5. 在每个循环中计算P*i,然后重复步骤1和步骤2,得到字符串Two,比较字符串One和Two,如果不相同置flag=false。
6. 在循环结束后,如果flag依然等于true,那么这个数字就是循环数。

你可以把这些步骤写成一个function,这可能更容易重复利用一些。

你如果想让输入的数字范围大一些,你可以在声明变量的时候,把它声明成双精度或者四精度的。

我试着写一个循环寻找循环数,范围是1-150000,居然只有一个循环数,就是142857。真是暴汗,不知道循环数有什么意义,太少了!

思路:
读数进来-》进行运算-》出来的新数-》找到新数的最小值,断开,以最小值为头进行排列-》对读进来的数进行最小值从头排列-》比对-》继续循环

形象点就是这样
142857 *2 = 285714
对285714改写成 142857(从最小的地方开始断) A
对142857 也进行同样改写 B

比对a和b 就可以了

高精度乘法+搜索