题目
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
题目分析展示
1.用char数组存储输入的大整数,将字符转换为数字并累加
char input[100]; // 使用字符数组存储输入
scanf("%s", input);
int len = strlen(input);
int sum = 0;
for (int i = 0; i < len; ++i) {
sum += input[i] - '0'; // 将字符转换为数字并累加
}
2.使用头插法创建链表,将sum里面的各个数字分解出来
struct Node {
int data;
struct Node* next;
};
struct Node* h = NULL;
struct Node* p;
while (sum) {
p = (struct Node*)malloc(sizeof(struct Node));
p->data = sum % 10;//从最后一个数字开始存储,开始头插
p->next = h;
h = p;
sum /= 10;//将sum砍掉一个数字
}
3.开始遍历链表中的数,并把每个数对应的中文名称归类
p = h;
while (p) {
switch (p->data) {
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
break;
case 0:
printf("ling");
break;
}
4.按照输出格式输出,如果不是最后一个数字就输出空格
if (p->next) {
printf(" ");
}
完整代码展示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
int data;
struct Node* next;
};
int main() {
char input[100]; // 使用字符数组存储输入
scanf("%s", input);
int len = strlen(input);
int sum = 0;
for (int i = 0; i < len; ++i) {
sum += input[i] - '0'; // 将字符转换为数字并累加
}
struct Node* h = NULL;
struct Node* p;
while (sum) {
p = (struct Node*)malloc(sizeof(struct Node));
p->data = sum % 10;
p->next = h;
h = p;
sum /= 10;
}
p = h;
while (p) {
switch (p->data) {
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
break;
case 0:
printf("ling");
break;
}
if (p->next) {
printf(" ");
}
p = p->next;
}
// 释放链表内存
while (h) {
p = h;
h = h->next;
free(p);
}
return 0;
}
结果调试
[补充]:为什么要用char数组来存储输入的n,而不用int
我最开始使用的就是int,结果发现当我输入普通的小数的时候,编译可以通过;
但是,当我输入大整数n=1234567890987654321123456789的时候,发现编译出错了,也就是超过了int能表示的整数范围,此时输不出来东西;但是我们用long long 也不行,所以可以考虑使用char数组,而且字符数组在累加每位数字的时候也更方便。
本人是刚入门的小白一枚~文章多有不成熟之处请各位大佬多多指教啦~