题目描述
循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子:
如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果停在一个相同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6
重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2
再这样做 (这次数两个): 8 1
再一次 (这次一个): 3
又一次: 6 2 8 这时你回到了起点,在经过每个数字一次后回到起点的就是循环数。如果你经过每一个数字一次以后没有回到起点, 你的数字不是一个循环数。
给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数, 输出数据保证结果能用一个无符号长整型数(21亿)装下。 (追加提醒:循环数每个数位都必须要访问到)
输入输出格式
输入格式:
仅仅一行, 包括M.
输出格式:
仅仅一行,输出第一个比M大的循环数。
输入输出样例
输入样例#1:
81361
输出样例#1:
81362
#include #include #include using namespace std; int main() { int num; scanf("%d", &num); int temp = num + 1; while (true) { num = temp; int x = num; int j; int k = -1; int w = 0; int n = num; while (n != 0) { n = n / 10; w = w + 1; } int *aw = new int[w]; vector bw; for (int i = w - 1; i >= 0; i--) { aw[i] = num % 10; num = num / 10; } temp++; int jugde = 0; for (int i = 0; i < w; i++) { for (int y = i + 1; y < w + 1; y++) { if (aw[i] == aw[y]) jugde = 1; } } if (jugde == 0) { int move; //移动的长度 int end; //移动后的下标 end = 0; move = aw[0]; int length = w; while(1) { end = (move + end) % w; if (aw[end] != 0) { move = aw[end]; aw[end] = 0; length--; } else break; } if (length == 0) { printf("%d\n", x); break; } } } return 0; }