【PAT乙级】1002 写出这个数 (20 分) C语言实现
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
代码实现:
- 解法一:
#include <stdio.h>
int main() {
char *pinyn[] = {
"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"
};
// 获取输入的字符串
char str[105]; // 10 ** 100 最多就 100 位数,多留几位
if (scanf("%s", str)) {
// 计算字符串中数字的和
int sum = 0;
int i = 0;
while (str[i] != '\0') {
sum += str[i] - '0';
i += 1;
}
// 将 sum 拆分然后放入数组中
int arr[5]; // 一百个 9 也就 900,三位数
int j = 0;
do {
int n = sum % 10;
arr[j] = n;
sum = sum / 10;
j++;
}
while(sum != 0);
// 输出拼音
for (i = j - 1; i >= 0; i--) {
if (i == 0) {
printf("%s", pinyn[arr[i]]);
} else {
printf("%s ", pinyn[arr[i]]);
}
}
printf("\n");
}
return 0;
}
- 解法二:
#include <stdio.h>
int main() {
char *pinyn[] = {
"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"
};
// 获取输入的字符串
char str[105];
scanf("%s", str);
int sum = 0;
int i = 0;
while (str[i] != '\0') {
// switch 或 '0123456789'取下标
//将字符转换为数字
sum += str[i] - '0';
i += 1;
}
// 求 sum 的长度
int len = 1;
int temp = sum / 10;
while(temp != 0) {
temp = temp / 10;
len += 1;
}
// 将 sum 拆分然后放入数组中
int arr[len];
for (int i = len - 1; i >= 0; i--) {
arr[i] = sum % 10;
sum = sum / 10;
}
// 输出拼音
for(int i = 0; i < len; i++) {
if (i == len - 1) {
printf("%s", pinyn[arr[i]]);
} else {
printf("%s ", pinyn[arr[i]]);
}
}
printf("\n");
return 0;
}