PAT乙级:1002

1002 写出这个数 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

1234567890987654321123456789

输出样例:

yi san wu



思路:首先是输入要求,是一个自然数,且不超过101位,有一定基础的同学肯定就已经知道了这个数过大超过了int、long之类的范围,只能通过char来定义了(非常惭愧的表示我好像java学的比c好一点,最近才开始补c可能废话会比较多)

输入问题解决了之后我们就要开始想下一步,也就是如何把这一串字符单个还原成int类型进行加运算。这里我搜了两个方法。一个是使用指针,btw这个不熟,我们用更简单的方法,直接ASCII码转换,用字符1减去48或者减去‘0’,这样我们就能得到整型的1

每一位数相加用for循环遍历 这个很简单就不多提

最后是输出拼音数字的问题,最开始我想用switch来实现,但是那样的话代码就太长了看着非常不清晰,最后我选择了定义一个字符串数组去存储我要输出的那十个数字拼音。(说来好笑,我还是算了一遍确定了无论如何之前求得的数字和都不会多过三位数才放心用if去做输出的。)

这个思路是我在CSDN找到的,附上网址:

作者:邓等灯

来源:CSDN

原文:https://blog.csdn.net/qq_39625459/article/details/80637929



//字符串解法:
(其实我一开始想到的是用switch函数,然后打到一半卡住了,想了很久结果上网一查,怎么代码这么简单!于是就用数组了!默默吐槽自己之前还刷过一条差不多的题都忘了数组有多好用,再说一遍:数组大法好)

#include

#include

int main(){

  char n[150];//字符

  char a[100];//总得和的长度存储

  int sum=0;//总的和

  int j=0,i;

  char py[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};//拼音的表()


  scanf("%s",n);//输入字符

  for(int i=0;i

    sum=sum+n[i]-'0';

  }

  //和转换成单个阿拉伯数字

  while(sum)

  {

    a[j++]=(sum%10)+'0';

    sum/=10;

  }

  //输出

  for(i=strlen(a)-1;i>=0;i--){


    if(i>0)  printf("%s ",py[a[i]-'0']);

    else printf("%s",py[a[0]-'0']);

  }


  return 0;

}

结果:(最后面正确的时候真的很开心XD)



总结:我的错误其实还是很多的,当时看的快崩溃,其实还是自己手生的问题。

1,字符串和字符的区别:字符串在转化为数字的时候变为字符各个-‘0’或-48

2,我之前还用到了fgets来输入字符串,然后就果不其然出现了溢出。。。书上说gets没有指明读取的最大字符数,故函数会无视可用空间一直往字符数组中存储数值,会出现程序崩坏T0T以后要少用少用

3,本次还不算成功,毕竟还是有借鉴别人的代码,希望以后二刷的时候自己写

你可能感兴趣的:(PAT乙级:1002)