c++ - 从数字到0最快的方法
问题描述
所以,我有这样的作业:
给定两个数字n
并且k
可以达到long long
极限,我们进行这样的操作:
- 赋值
n = n / k
ifn
可以被整除k
- 如果不能被整除,
n
则减少1
n
k
找到要从n
到的最小操作数0
。
这是我的解决方案
#define ll long long
ll smallestSteps(ll n, ll k) {
int steps = 0;
if (n < k) return n;
else if (n == k) return 2;
else {
while (n != 0) {
if (n % k == 0) {
n /= k;
steps++;
}
else {
n--;
steps++;
}
}
return (ll)steps;
}
}
我认为这个解决方案是O(n/k)
什么?
但我认为它n
可能k
非常大,因此程序可能会超过 1s 的时间限制。有没有更好的方法来做到这一点?
编辑1:我用ll
它来缩短
解决方案
鉴于以下观察结果,可以改进算法:
- 如果
n<k
thenk|(n-m)
将永远不会适用于任何正 m。所以答案是n
步骤。 - 如果
(k|n)
不成立,那么它成立的最大数m, m<n
是n - (n%k)
. 所以它采取n%k
步骤直到 (k|m) 再次成立。
实际上,您所需要的只是继续使用余数进行除法std::div
(或依靠编译器进行优化),并将步数增加余数+1。
steps=0
while(n>0)
mod = n%k
n = n/k
steps+=mod + 1
return steps
推荐阅读
- python - 如何使用win32com python打印word文档中的所有脚注?
- c# - 无法解析 Autofac 中的注册类型
- wordpress - 将 Apache、Wordpress 和 Media Wiki 迁移到 docker
- javascript - TypeError:state.items 不可迭代
- java - 如何通过 Java 访问 IBM Doors?
- java - Spring Batch Worker Pod 日志在 Spring Cloud 数据流中不可见
- oracle - Oracle 过程变量尚不可表示
- c++ - 创建 c++ 程序时我需要关心字节顺序吗?
- html - Upvote 和 downvote 按钮没有相互显示
- typescript - 如何使 Vue i18n 在单元测试中从 .json 文件加载翻译?