Codeforces Round #643 (Div. 2) A

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值