
2026-02-24:计算十进制表示。用go语言,给定一个正整数 n。把能写成 d×10^k(其中 d 是 1 到 9 的整数,k 是非负整数)的正整数称为“十位分量”——等价于十进制表示里只有一位非零数字。例如 500、30、7 符合这一形式,而 537、102、11 不符合。
要求把 n 拆成若干个这样的十位分量之和,且所用分量的数量尽可能少。输出这些分量组成的数组,并按数值从大到小排序。
1 <= n <= 1000000000。
输入:n = 537。
输出:[500,30,7]。
解释:
我们可以将 537 表示为500 + 30 + 7。无法用少于 3 个 10 进制分量表示 537。
题目来自力扣3697。
我们以输入 n = 537 为例,逐步拆解代码的执行逻辑,核心目标是把数字拆成最少的“十位分量”(仅一位非零的数)并降序排列:
函数 decimalRepresentation 接收参数 n = 537 后,首先做两件事:
ans(切片类型),用于存储最终的十位分量;pow10 并初始化为 1,这个变量用于计算当前位的“位权”(即 10^k,k从0开始,对应个位、十位、百位等)。进入 for 循环,循环条件是 n > 0,每次循环会完成“取当前最低位→判断是否有效→计算十位分量→更新n和位权”的操作,具体过程如下:
循环次数 | 初始n值 | 执行操作 | 执行后n值 | pow10值 | ans切片变化 |
|---|---|---|---|---|---|
第1次 | 537 | 1. 取最低位:d = 537 % 10 = 72. d>0,计算分量:7×1=7,加入ans3. n = 537 / 10 = 534. pow10 = 1×10 = 10 | 53 | 10 | [7] |
第2次 | 53 | 1. 取最低位:d = 53 % 10 = 32. d>0,计算分量:3×10=30,加入ans3. n = 53 / 10 = 54. pow10 = 10×10 = 100 | 5 | 100 | [7, 30] |
第3次 | 5 | 1. 取最低位:d = 5 % 10 = 52. d>0,计算分量:5×100=500,加入ans3. n = 5 / 10 = 04. pow10 = 100×10 = 1000 | 0 | 1000 | [7, 30, 500] |
结束 | 0 | 循环条件n>0不满足,退出循环 | - | - | - |
注:循环中“d>0”的判断是为了跳过数字中的0位(比如n=507时,十位的0会被跳过,不会生成0×10=0这样的无效分量)。
循环结束后,ans切片中的元素是 [7, 30, 500],而题目要求按数值从大到小排序,因此调用 slices.Reverse(ans) 反转切片,得到 [500, 30, 7]。
函数返回处理后的ans切片,main函数接收结果后打印,最终输出 [500 30 7],符合题目要求。
slices.Reverse 是原地反转,时间复杂度为O(k)(k为切片长度,等于n的非零位数,最多等于k);pow10、d、n(函数内的副本)等都是单个整型变量,空间开销为O(1);.
package main
import (
"fmt"
"slices"
)
func decimalRepresentation(n int) (ans []int) {
pow10 := 1
for ; n > 0; n /= 10 {
d := n % 10
if d > 0 {
ans = append(ans, d*pow10)
}
pow10 *= 10
}
slices.Reverse(ans)
return
}
func main() {
n := 537
result := decimalRepresentation(n)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def decimal_representation(n: int) -> list[int]:
"""
将整数拆分为十进制位值表示
例如: 537 -> [500, 30, 7]
"""
ans = []
pow10 = 1
while n > 0:
d = n % 10 # 获取最后一位数字
if d > 0:
ans.append(d * pow10)
n //= 10 # 去掉最后一位
pow10 *= 10
ans.reverse()
return ans
if __name__ == "__main__":
n = 537
result = decimal_representation(n)
print(result)
.
#include <iostream>
#include <vector>
#include <algorithm>
std::vector<int> decimalRepresentation(int n) {
std::vector<int> ans;
int pow10 = 1;
while (n > 0) {
int d = n % 10; // 获取最后一位数字
if (d > 0) {
ans.push_back(d * pow10);
}
n /= 10; // 去掉最后一位
pow10 *= 10;
}
std::reverse(ans.begin(), ans.end());
return ans;
}
int main() {
int n = 537;
std::vector<int> result = decimalRepresentation(n);
// 打印结果
std::cout << "[";
for (size_t i = 0; i < result.size(); ++i) {
std::cout << result[i];
if (i < result.size() - 1) {
std::cout << ", ";
}
}
std::cout << "]" << std::endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·