You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kattis大整数10的幂除法问题:优化insert操作解决超时

解决大整数除以10的幂超时问题:替代insert的高效字符串处理方案

首先可以明确说:用字符串处理大整数是完全正确的思路,毕竟大整数远超普通数值类型的存储范围,字符串是这类问题的标准解法,不用怀疑这个方向。

你遇到的超时问题确实大概率是频繁调用insert导致的——大多数编程语言里,字符串的insert操作(尤其是在开头或中间位置)时间复杂度是O(n),每次插入都要移动后续所有字符,次数多了累积起来就会拖慢整个程序。

那怎么替换insert?核心思路是用字符串切片和拼接来替代插入操作,因为切片是一次性定位到目标位置,避免了多次移动字符的开销。针对你要解决的「除以100(即10²)」的场景,我们可以分情况直接构造结果:

具体实现步骤(以Python为例,思路适用于所有语言)

假设输入的大整数字符串为s,我们要计算s / 100:

  1. 处理特殊情况:输入为"0"
    如果输入就是单个"0",直接返回"0"即可,不用做后续处理。

  2. 分长度判断构造结果
    设字符串长度为n,要除以的是10^2,所以k=2:

    • 当n ≤ k时:
      比如输入是"5"(n=1)、"12"(n=2),结果需要补前导0和小数点:
      • 计算需要补的前导0数量:k - n
      • 结果格式为:"0." + ("0"*(k-n)) + s
      • 注意:如果输入是带前导0的合法整数(比如"00"),最后要简化为"0"
    • 当n > k时:
      比如输入是"12345"(n=5),我们需要在倒数第2位前插入小数点:
      • 整数部分是s[:n - k](即前n-2个字符,比如"12345"的整数部分是"123")
      • 小数部分是s[n - k:](即后2个字符,比如"45")
      • 接下来要清理小数部分的无效后缀0:
        • 去掉小数部分末尾的所有0,如果小数部分变成空字符串,就只保留整数部分;否则保留整数部分 + "." + 清理后的小数部分
        • 比如输入是"12300",小数部分是"00",清理后为空,结果就是"123";输入是"1230",小数部分清理后是"3",结果是"12.3"

示例代码片段(Python)

s = input().strip()
if s == "0":
    print("0")
else:
    k = 2
    n = len(s)
    if n <= k:
        # 补前导0和小数点
        leading_zeros = "0" * (k - n)
        result = f"0.{leading_zeros}{s}"
        # 若原数是全0(如"00"),简化为"0"
        if result == "0.00":
            print("0")
        else:
            print(result)
    else:
        integer_part = s[:n - k]
        decimal_part = s[n - k:]
        # 清理小数部分的后缀0
        decimal_part = decimal_part.rstrip("0")
        if not decimal_part:
            print(integer_part)
        else:
            print(f"{integer_part}.{decimal_part}")

为什么这个方法更快?

字符串切片和拼接操作都是一次性完成的,整个过程只需要遍历字符串几次(比如清理后缀0的时候),时间复杂度是O(n),而频繁的insert操作如果是多次的话,时间复杂度会变成O(m*n)(m是插入次数),效率差距非常明显。

总结一下:你的思路没问题,只是insert的使用方式拖慢了速度,换成切片拼接的方式就能轻松解决超时问题。

内容的提问来源于stack exchange,提问作者user2953932

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:09:23