1168 字
4 分钟阅读
整数的持续性
题目描述
从任一给定的正整数 n 出发,将其每一位数字相乘,记得到的乘积为 n_1 。以此类推,令 n_{i + 1} 为 n_i 的各位数字的乘积,直到最后得到一个个位数 n_m ,则 m 就称为 n 的持续性。例如 679 的持续性就是 5 ,因为我们从 679 开始,得到 6 \times 7 \times 9 = 378 ,随后得到 3 \times 7 \times 8 = 168 、 1 \times 6 \times 8 = 48 、 4 \times 8 = 32 ,最后得到 3 \times 2 = 6 ,一共用了 5 步。
本题就请你编写程序,找出任一给定区间内持续性最长的整数。
输入格式
输入在一行中给出两个正整数 a 和 b (1 \le a \le b \le 10 ^ 9 且 (b - a) < 10 ^ 3) ,为给定区间的两个端点。
输出格式
首先在第一行输出区间 [a,b] 内整数最长的持续性。随后在第二行中输出持续性最长的整数。如果这样的整数不唯一,则按照递增序输出,数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例
500 700
输出样例
5
679 688 697
题意
定义了一个概念叫整数的连续性:对数位进行相乘,直到成为个位数,在此过程中产生的新数字的数量。
给出一个区间,求出区间内连续性最大的数字,可能存在多个。
思路
模拟题意即可。
代码
int f(int x){
int cnt = 0;
while(x >= 10){
int to = 1;
while(x){
to *= x % 10;
x /= 10;
}
cnt++;
x = to;
}
return cnt;
}
void solve(){
int l,r;
cin >> l >> r;
int len = 0;
vector<int> ans;
for(int i = l;i <= r;i++){
int cnt = f(i);
if(cnt > len){
ans.clear();
ans.push_back(i);
len = cnt;
}else if(cnt == len){
ans.push_back(i);
}
}
cout << len << "\n";
for(int i = 0;i < ans.size();i++){
if(i) cout << " ";
cout << ans[i];
}
}
