先把题目放上来:
题目描述:
有一天,小明给了你两个数字和,现在,你需要对数字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;
}
哎,考试时碰到水题还是要仔细一点,不然总掉坑里!!!