Codeforces Round #643 (Div. 2) A
链接: 传送门.
思路:
将数字各个位上的数存入一个数组中,找出这个数组中最大的值和最小的值;按照题中给出的递推公式算出ak。
注意:
如果数字的某一位是零的话,那么最大最小值的乘积也是零,所以之后全部是这个数字,可以跳出循环直接输出。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
//int rr=0;
int r[20]= {0}; //存放各个位上的数
int g(ll a) { // 分离各个位,并找出最大值最小值,返回它俩的乘积
int i=0;
while(a) {
r[i] = a%10;
a = a/10;
if(r[i]==0) { // 若有一位为 0,则跳出函数并且返回 0
// rr = 1; //rr可以验证此if起作用
return 0;
}
i++;
}
int x=r[0], y=r[0];
for(int k=1; k<i; k++) { //找出最大和最小
if(x<r[k]) x=r[k];
if(y>r[k]) y=r[k];
}
return x*y;
}
int main() {
int t;
cin>>t;
while(t--) {
ll a, b; //注意数据范围
cin>>a>>b;
while(--b) {
if(g(a)==0) break; // 某一位为零则跳出循环跳出循环
a = a + g(a);
}
cout<<a<<endl;
// cout<<"rr="<<rr<<endl;
// rr=0;
}
}```