L1-103 整数的持续性

题目描述

从任一给定的正整数 n 出发,将其每一位数字相乘,记得到的乘积为 n1n _1n1​ 。以此类推,令 ni+1n _{i+1}ni+1nin _ini 的各位数字的乘积,直到最后得到一个个位数 nmn _mnm ,则 mmm 就称为 nnn 的持续性。例如 679679679 的持续性就是 555,因为我们从 679679679 开始,得到 6×7×9=3786×7×9=3786×7×9=378,随后得到 3×7×8=168、1×6×8=48、4×8=323×7×8=168、1×6×8=48、4×8=323×7×8=1681×6×8=484×8=32,最后得到 3×2=63×2=63×2=6,一共用了 555 步。

本题就请你编写程序,找出任一给定区间内持续性最长的整数。

输入格式:

输入在一行中给出两个正整数aaabbb(1≤a≤b≤109且(b−a)<103)(1≤a≤b≤10 ^9 且 (b−a)<10 ^3 )1ab109(ba)<103,为给定区间的两个端点。

输出格式:

首先在第一行输出区间 [a,b][a,b][a,b] 内整数最长的持续性。随后在第二行中输出持续性最长的整数。如果这样的整数不唯一,则按照递增序输出,数字间以 111 个空格分隔,行首尾不得有多余空格。

输入样例:

500 700

输出样例:

5
679 688 697

代码内容

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N=1e6+10;
ll pos[N];

int main()
{
    ll a,b;
    cin>>a>>b;

    ll maxn=0;
    ll k=0;
    for(ll i=a;i<=b;i++)
    {
        ll temp=i;
        ll index=0;
        while(temp>9)
        {
            ll arr=1;
            while(temp>0)
            {
                arr*=temp%10;
                temp/=10;
            }
            temp=arr;
            index++;
        }

        maxn=max(maxn,index);
        pos[k]=index;
        k++;
    }

    cout<<maxn<<endl;

    ll tt=0;
    for(ll i=0;i<=b-a;i++)
    {
        if(!tt)
        {
            if(pos[i]==maxn)
            {
                cout<<i+a;
                tt=1;
            }
        }
        else if(pos[i]==maxn)
        {
            cout<<" "<<i+a;
        }
    }

    return 0;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐