1002写出这个数

题目

读入一个正整数 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数组,而且字符数组在累加每位数字的时候也更方便。


本人是刚入门的小白一枚~文章多有不成熟之处请各位大佬多多指教啦~ 

 

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值