PAT 1002. 写出这个数 (20)

题目概述
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:
每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。
输出格式:
在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。

输入样例:
1234567890987654321123456789

输出样例:
yi san wu

思路:

  • 先读取自然数n,边读取边计算各位数字的和,只需一个字符和一个整型。
  • 构建一个0-9拼音的字符串数组,不低于100的输出百位,不低于10的输出十位,最后输出个位即可。
  • 一个数组count[100]记录输入的数值
  • 尝试用get获得count的取值
#include<stdio.h>
#include<string.h>

int main() {
    //char n;
    char count[100];  //记录输入的数值
    char num[11]; //转换位数,从低到高
    int sum=0;  //记录答案大小
    int length = 0;  //记录输入数组的长度
    int anslength=0;  //记录答案的长度

    char *ans[] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };  //字符数组赋值

     /*
        先输入数据,之后getchar()的返回值一个接一个赋给c, 然后比较c是不是不等于回车键,
        如果不等于回车键就会执行循环。如果等于就会结束。
     */

    /*
    这种方法也可以,个人感觉更方便,此方法也是转载
    作者:OliverLew 
    链接:https://www.jianshu.com/p/2700af335690 
    來源:简书 
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    while ((n = getchar()) != '\n')
        sum += n - '0'; //减去0是为了转成正常的0-9而不是ASCII码

    if (sum / 100) //hundreds
        printf("%s ", ans[sum / 100]);
    if (sum / 10) //tens
        printf("%s ", ans[sum / 10 % 10]);
    printf("%s", ans[sum % 10]);
    */

    /*
        下面方法主要是使用了get获得字符串内容
        然后通过数组进行存储和转换
        注意:
            两个常用的小技巧
            “/”用于去掉最后一位
            “%”用于获得最后一位     
    */
    gets(count);
    length = strlen(count);
    for (int i = 0; i < length; i++)
    {
        sum += count[i] - '0';
    }
    while (sum != 0) {
        num[anslength] = sum % 10;
        sum /= 10;
        anslength++;
    }
    if (anslength != 0) {
        anslength--;
        printf("%s", ans[num[anslength]]);
        int temp = --anslength;
        for (int i = temp; i >= 0; i--)
        {
            printf(" %s", ans[num[i]]);
        }
    }
    else {
        printf("%s", ans[anslength]);
    }
    return 0;
}

这道题刚开始的时候也是没有思路,主要是对于数组和字符串都不怎么熟悉,不知道如何获取字符串的值,这里主要了解了gets个getchar的基本用法,但对于它们的区别并不是特别清楚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值