B3996 [洛谷 202406GESP 模拟 三级] 小洛的数字游戏

题目描述

小洛有一个正整数 𝑛n,他会进行若干次下列操作:

  • 取出正整数 𝑛 的末位,记作 𝑥;
  • 将 𝑥平方之后,保留个位,放于 𝑛 的首位之前(特别地,如果 𝑥 为 0,则不进行该步);

上述两步合计为一次操作。例如有一个正整数 142,它可以进行如下操作:

  • 取出末尾的 2,原正整数变为 14;
  • 2^2=4,放于 14 首位之前成为 414,第一次操作完成;
  • 取出末尾的 4,原正整数变为 41;
  • 4^2=16,保留个位的 6,放于 41 的首位成为 641,第二次操作完成;
  • 以此类推……

现在小洛想知道,对于一个正整数 𝑛,能否进行不超过 𝑞 次操作让其变为正整数 𝑚。请你帮帮他。

输入格式

输入三个正整数 𝑛,𝑚,𝑞。

输出格式

如果能进行不超过 𝑞 次操作让正整数 𝑛 变为正整数 𝑚,则输出若干行,第 𝑖 行输出一个正整数表示进行第 𝑖次操作后的正整数 𝑛 的值。否则输出一行一个整数 −1。

输入输出样例

输入 #1

123 611 10

输出 #1

912
491
149
114
611

输入 #2

123 231 12345

输出 #2

-1

说明/提示

对于 30% 的数据,保证小洛实际只需要不超过 5

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

int weishu(int n){///求位数
    int sum=0;
    while(n!=0){
        n/=10;
        sum++;
        
    }
    return sum;
}
long long cifang10(int n){//补0使用(判断第一位放前面)
    long long mul=1;
    for(int i=1;i<=n;i++)mul*=10;
    return mul;
}
int main(){
    int n,m,q;
    cin>>n>>m>>q;
    const int M=m;
    int a[q+10];
    for(int i=1;i<=q;i++){//加入n=142
        int g=n%10;//g=2
        n-=g;//142-2=140
        n/=10;//n=14
        int gf=(g*g)%10;//2*2=4
        n+=(gf*cifang10(weishu(n)));//重点来了!!!14+(4*1e2)=414  提示(不符合语法)1e2=100  4*100=400,400+14=414
        if(m==n){//等于M后直接停止
            break;
        }
      //测试//cout<<n;测试
       // return 0;测试
        a[i]=n;//、、存储计算过程
    }
    if(n!=m)cout<<-1;//bushi
    else{
        for(int i=1;i<=q;i++){
            if(a[i]!=0){
            	cout<<a[i]<<endl;//guocheng过程
       		}
            if(a[i]==0){//把if注释掉自己看
                cout<<m;//结果
                break;
            }
        }
    }
    return 0;
}

 次操作即可得到 𝑚;

对于所有数据,数据保证 1≤𝑛,𝑚≤109,1≤𝑞≤106。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值