题目链接
题目描述
给定一个正整数,需要将其转换为千分位格式。即从该整数的最低位(右侧)开始,每三位数字插入一个英文逗号。
输入描述:
- 在一行中输入一个正整数
n
。
输出描述:
- 输出一个字符串,表示将
n
转换为千分位格式后的结果。
示例:
- 输入:
980364535
- 输出:
980,364,535
- 输入:
6
- 输出:
6
解题思路
解决这个问题的最直观、最通用方法是从后向前遍历数字字符串,并手动插入逗号。直接从前向后处理会因为不知道起始段的长度(1、2还是3位)而变得复杂。
-
读取输入为字符串: 由于我们需要对数字的每一位进行操作,最方便的方式是直接将输入读取为字符串
s
。 -
从右向左构建新字符串: 我们创建一个新的空字符串(或
StringBuilder
)来存放结果。然后,从原字符串s
的最后一个字符开始向前遍历。 -
计数与插入:
- 设置一个计数器
count
,初始为0
。 - 在循环中,每从
s
中取出一个数字字符并添加到我们的结果字符串头部(或尾部,取决于构建方式),就将count
加一。 - 当
count
等于3
时,就意味着我们已经处理了三位数字。此时,如果还没遍历到字符串的开头(即当前索引i > 0
),就在结果中添加一个逗号,然后将count
重置为0
。
- 设置一个计数器
-
反转结果: 因为我们是从右向左遍历原字符串并顺次添加字符,所以得到的结果字符串是反的(例如,对于 "12345",我们会先得到 "543,21")。因此,最后需要将整个结果字符串反转过来,才能得到正确的顺序。
-
输出: 打印最终反转后的字符串。
这种方法不依赖任何特定的库函数,逻辑清晰,适用于所有编程语言。
捷径 (特定语言)
- Python: Python 提供了非常简洁的格式化语法,如
f"{1234567:,}"
会直接输出'1,234,567'
。 - Java: Java 的
String.format("%,d", 1234567)
或NumberFormat
类也能轻松实现。
在解题时,手动实现的方法更能体现算法思想,而内置函数在实际工程中更高效。
代码
#include <iostream>
#include <string>
#include <algorithm> // for std::reverse
using namespace std;
int main() {
// 1. 读取为字符串
string s;
cin >> s;
string result_reversed = "";
int count = 0;
// 2. 从右向左遍历
for (int i = s.length() - 1; i >= 0; --i) {
result_reversed += s[i];
count++;
// 3. 每三位且不是最开头,加一个逗号
if (count == 3 && i > 0) {
result_reversed += ',';
count = 0;
}
}
// 4. 反转得到最终结果
reverse(result_reversed.begin(), result_reversed.end());
// 5. 输出
cout << result_reversed << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 1. 读取为字符串
String s = sc.next();
// 使用 StringBuilder 高效拼接字符串
StringBuilder resultReversed = new StringBuilder();
int count = 0;
// 2. 从右向左遍历
for (int i = s.length() - 1; i >= 0; i--) {
resultReversed.append(s.charAt(i));
count++;
// 3. 每三位且不是最开头,加一个逗号
if (count == 3 && i > 0) {
resultReversed.append(',');
count = 0;
}
}
// 4. 反转并输出
System.out.println(resultReversed.reverse().toString());
}
}
# 1. 读取为字符串
s = input()
# 对于短数字,直接输出
if len(s) <= 3:
print(s)
else:
result_reversed = []
count = 0
# 2. 从右向左遍历
for i in range(len(s) - 1, -1, -1):
result_reversed.append(s[i])
count += 1
# 3. 每三位且不是最开头,加一个逗号
if count == 3 and i > 0:
result_reversed.append(',')
count = 0
# 4. 反转并连接成字符串
print("".join(reversed(result_reversed)))
# Pythonic Way (更简洁的工程做法)
# try:
# n = int(input())
# print(f"{n:,}")
# except (ValueError, EOFError):
# pass
算法及复杂度
- 算法: 字符串遍历与操作。
- 时间复杂度:
,其中
L
是输入数字字符串的长度。我们需要遍历一次字符串来构建新字符串,再遍历一次(或使用reverse
)来反转它。 - 空间复杂度:
。需要一个额外的空间来存储构建的新字符串,其长度与输入长度大致相同(会多几个逗号)。