给定两个正整数 N1<N2。把从 N1 到 N2 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。
例如 N1=1 和 N2=10 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。
本题就请你对任意给定的 N1<N2 求出对应的数字之王。
输入格式:
输入在第一行中给出两个正整数 0<N1<N2≤103,其间以空格分隔。
输出格式:
首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入 1 10
就应该在两行中先后输出 6
和 8
。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
10 14
输出样例:
2
0 8
C++:
#include <bits/stdc++.h>
using namespace std;
int digit_sum_pow(int number) {
int sum = 0;
int prod = 1;
while (number) {
int digit = number % 10;
prod *= digit * digit * digit;
number /= 10;
}
while (prod) {
sum += prod % 10;
prod /= 10;
}
return sum;
}
int main() {
int N1, N2;
cin >> N1 >> N2;
int count[10] = {0}; //存储0-9出现的次数
vector<int> numbers(N2 - N1 + 1);
// 初始化
for(int i = 0; i <= N2 - N1; ++i) {
numbers[i] = N1 + i;
}
// 直到所有数字都是单个数字
bool flag = false;
while (!flag) {
flag = true;
for(int &num : numbers) {
if(num > 9) {
flag = false;
num = digit_sum_pow(num);
}
}
}
// 计数
for(int num : numbers) {
count[num]++;
}
int maxCount = *max_element(count, count + 10);
cout << maxCount << endl;
bool first = true;
for(int i = 0; i < 10; ++i) {
if(count[i] == maxCount) {
if(first) {
cout << i;
first = false;
} else {
cout << " " << i;
}
}
}
return 0;
}