【From Hero to Zero】题解

先把题目放上来:


题目描述:

有一天,小明给了你两个数字和,现在,你需要对数字n进行一下操作:对于每一步操作,你可以选择下面其中一个项目:将的值减少.如果能被整除,可以使比如:,你可以进行下列操作:请你计算出数字变为时最少需要的操作数。


输入格式:

第一行输入一个整数n,表示数据个数
接下来行n,每行个整数和


输出格式

将数字变为的最小次数


输入样例:
2
593
1000000000000000000


输出样例:
8
19


这道题其实也并不难,但是考试时就无脑计算然后就情理之中而又意料之外地 TLE 了。。。
这道题其实就是一道水题,只要稍微的动一下脑筋就好了,注释写在代码上:

代码

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long//保险起见
using namespace std;

int main() {
	ll t;
	scanf("%lld", &t);//多组输入
	while (t--) {
		ll n, k;
		ll ans = 0;
		scanf("%lld %lld", &n, &k);
		while (n) {
			if (n % k == 0) {//因为题目中说了,k 不等于 1,所以除以 k 一定比一直减要优,
				n /= k;
				ans ++;
			}//常规操作
			else {
				ans += n % k;//重点。 假如说现在 n 不能被 k 整除,n 就一定会减去 n % k,我们就不让他一遍一遍去减了
				n -= n % k; //减去
			}
		} 
		printf("%lld
", ans);//常规操作
	}
	return 0;
}

哎,考试时碰到水题还是要仔细一点,不然总掉坑里!!!

原文地址:https://www.cnblogs.com/cqbzyanglin/p/13519182.html