题目链接

添加逗号

题目描述

给定一个正整数,需要将其转换为千分位格式。即从该整数的最低位(右侧)开始,每三位数字插入一个英文逗号。

输入描述:

  • 在一行中输入一个正整数 n

输出描述:

  • 输出一个字符串,表示将 n 转换为千分位格式后的结果。

示例:

  • 输入: 980364535
  • 输出: 980,364,535
  • 输入: 6
  • 输出: 6

解题思路

解决这个问题的最直观、最通用方法是从后向前遍历数字字符串,并手动插入逗号。直接从前向后处理会因为不知道起始段的长度(1、2还是3位)而变得复杂。

  1. 读取输入为字符串: 由于我们需要对数字的每一位进行操作,最方便的方式是直接将输入读取为字符串 s

  2. 从右向左构建新字符串: 我们创建一个新的空字符串(或 StringBuilder)来存放结果。然后,从原字符串 s 的最后一个字符开始向前遍历。

  3. 计数与插入:

    • 设置一个计数器 count,初始为 0
    • 在循环中,每从 s 中取出一个数字字符并添加到我们的结果字符串头部(或尾部,取决于构建方式),就将 count 加一。
    • count 等于 3 时,就意味着我们已经处理了三位数字。此时,如果还没遍历到字符串的开头(即当前索引 i > 0),就在结果中添加一个逗号,然后将 count 重置为 0
  4. 反转结果: 因为我们是从右向左遍历原字符串并顺次添加字符,所以得到的结果字符串是反的(例如,对于 "12345",我们会先得到 "543,21")。因此,最后需要将整个结果字符串反转过来,才能得到正确的顺序。

  5. 输出: 打印最终反转后的字符串。

这种方法不依赖任何特定的库函数,逻辑清晰,适用于所有编程语言。

捷径 (特定语言)

  • 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)来反转它。
  • 空间复杂度: 。需要一个额外的空间来存储构建的新字符串,其长度与输入长度大致相同(会多几个逗号)。