1002 写出这个数

该博客介绍了如何处理大整数(最大可达10^100)的各位数字之和,并将其转换为汉语拼音。提供了一种将输入的数字字符串转换成拼音的方法,包括使用C、C++和Java的实现。通过遍历字符串,累加数字,然后按位输出对应的拼音。此外,还提出了递归输出的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。


输入样例:

1234567890987654321123456789

输出样例:

yi san wu

思路

1. 给的数字n可以非常大(10^100),所有只能把n当成字符串读入

2. 设sum为所有位数上的数字和

3. 因为字符 '0' ASCII码为48,'1' ASCII码为49

    所以对于组成n的任意一个数字num, sum+=num-48

4. 取余sum并存入一个数组,最后挨个按其对应的拼音输出即可

扩展思考

算出各位数总和后,你能否用递归法直接输出答案


C

#include<stdio.h>
char* OP(int num){
	if(num==1) return "yi";
	if(num==2) return "er";
	if(num==3) return "san";
	if(num==4) return "si";
	if(num==5) return "wu";
	if(num==6) return "liu";
	if(num==7) return "qi";
	if(num==8) return "ba";
	if(num==9) return "jiu";
	return "ling";
}
int main(){
	char n[2022];
	int sum=0,nums[2022],len=0; // 总和 , 总和各个位数保存 , 总和的位数
	scanf("%s",n);
	for(int i=0;n[i]!='\0';i++){
		sum += n[i] - 48;
	}
	do{  // 考虑sum=0的情况,不能直接用while循环
		len++;
		nums[len] = sum%10;
		sum/=10;
	}while(sum>0);
	for(int i=len;i>1;i--){
		printf("%s ",OP(nums[i]));
	}
	printf("%s",OP(nums[1]));
	return 0;
}

C++ (递归输出)

#include<bits/stdc++.h>
using namespace std;
string key[10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
void OP(int num){
	if(num>9){
		OP(num/10);
		cout << " ";
	}
	cout << key[num%10];
}
int main(){
	string n;
	int sum=0;
	cin >> n;
	for(int i=0;i<n.size();i++){
		sum += n[i]-48;
	}
	OP(sum);
	return 0;
}

JAVA

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int sum=0,len=0;
        int[] nums = new int[2022];
        for(int i=0;i<s.length();i++){
            sum += s.charAt(i)-48;
        }
        do{
            nums[len++] = sum % 10;
            sum/=10;
        }while(sum>0);
        while (len>0){
            switch (nums[--len]) {
                case 0:  System.out.print("ling");break;
                case 1:  System.out.print("yi");break;
                case 2:  System.out.print("er");break;
                case 3:  System.out.print("san");break;
                case 4:  System.out.print("si");break;
                case 5:  System.out.print("wu");break;
                case 6:  System.out.print("liu");break;
                case 7:  System.out.print("qi");break;
                case 8:  System.out.print("ba");break;
                case 9:  System.out.print("jiu");break;
            }
            if(len>0) System.out.print(' ');
        }
    }
}

PY

dict1 = {0: 'ling', 1: "yi", 2: 'er', 3: 'san', 4: 'si', 5: 'wu', 6: 'liu', 7: 'qi', 8: 'ba', 9: 'jiu'}


def OP(sum):
    if sum > 9:
        OP(sum // 10)
        print(" ", end='')
    print(dict1[sum % 10], end='')


n = input()
sum = 0

for num in n:
    sum += ord(num) - 48

OP(sum)

本专栏个人参考题解(C、C++、Java、py)  ->  PAT (Basic Level) Practice(中文)


持续更新中,点个关注、按个收藏、不迷路哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三块不一样的石头

十分满意,一分打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值