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];
    }
}

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注