题目描述
小洛有一个正整数 𝑛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。