菜鸟记录:c语言实现PAT甲级1005–Spell It Right

 非常简单的一题了,但还是交了两三次,原因:对数组的理解不足;对数字和字符之间的转换不够敏感。这将在下文中细说。

Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum in English.

Input Specification:

Each input file contains one test case. Each case occupies one line which contains an N (10100).

Output Specification:

For each test case, output in one line the digits of the sum in English words. There must be one space between two consecutive words, but no extra space at the end of a line.

Sample Input:

12345
 

Sample Output:

one five

题目分析

  输入一串数字,然后用英文表达所有数字相加和的每一位数字。

    输入:10100以内的数字

    输出:和的每位数字英文表达(eg:sum=256,output=two five six)

首先很明显代码是不会翻译你的结果的,所有用一个数组来存储表示每位数字的英文,其次,10100的数字不需要精准表示,因为这里也就100个数字,不是10100个数字,开始我在这卡了半天,想着数字太大要精准存储,特地翻了之前写的c语言-大数阶乘 - 1001010 - 博客园 (cnblogs.com)一文,后面发现不大行的通,审视一遍后发现了问题,最后输出,要怎么拆开数字和也是个问题。

个人想法

  首先,还是从变量入手

1 #define  MAX  100
2 int N,m;//输入N,用于统计N的位数m
3 char lan[10][10] = { "zero","one","two","three","four","five","six","seven","eight","nine" };
4 int sum,a[MAX];//计算和sum,数组a用来记录拆开的sum
5 char n[MAX];

  这里开始是想N用来输入数据,后面发现循环过程中因为不知道它的位数,所以往往遍历要很多【补:而且N作为int变量放不了100位,double型的时候可以,但sum作为int不能让N强转,都作为double时就会很麻烦】,所以在错了一次后采取了  char n[MAX];  的写法,这样有很多的妙处:

  1. 可以利用字符串来进行自动分割,即在输入时不赋值在地址上(n的每位地址),scanf("%s", &n[i]); ❌  scanf("%s", &n);❌  scanf("%s", n);✔  c语言因为只接受字符,不支持string,写成这样就会自动把一串数字字符串分成单独的数字字符并赋值在每个空间单位上。
  2. 循环遍历时,不需要知道有几位,因为每个字符是被附在每个单位空间上的,所以这个数组遍历到空,即'\0'就可以停止。
  3. 由于得到的是字符的地址(数字自生的ACII值),所以在计算sum时,不用强转,而是减去0的ACII值,这个差不仅是地址差也非常融洽的是数字之间的差。

  到这里其实已经没有什么疑惑的点了,下面直接上完整代码。

 1 #include<stdio.h>
 2 
 3 #define  MAX  150
 4 int N,m;
 5 char n[MAX];
 6 char lan[10][10] = { "zero","one","two","three","four","five","six","seven","eight","nine" };
 7 int sum,a[MAX];
 8 int main() {
 9     scanf("%s", n);
10     for (int i = 0; n[i] != '\0'; i++) {
11         sum += n[i] - '0';
12     }
13     if (sum == 0){printf("zero");return 0;}//如果和等于0 ,那么直接输出“zero”就行。注意,这里必须return终止,因为数组a[-1]也是0
14     for (int i = 0; sum; i++) {
15         a[i] = sum % 10;
16         sum /= 10;
17         m += 1;//m记录sum的位数,但注意数组在使用时要减1,因为超范围了
18     }//sum最后等于0时即完成所有位数的记录,终止循环(非常巧妙) 
19     
20         printf("%s", lan[a[m - 1]]);
21         for(int i=m-2;i>=0;i--)
22             printf(" %s", lan[a[i]]);//老一套输出格式,每一位的数字对于英语组记录的每一位上的英文
23     
24     return 0;
25 }

菜鸟记录:c语言实现PAT甲级1005--Spell It Right

 

总结

  • 数组的利用,例如本文对英语的存储采用了二维数组,由于是char型,每单位只存放一个字符,所以lan[10][10]有10行10列,每列存放一个字符,一行存放10个字符。如果列数不足或是刚好,就会因为没有读到 '\0' 而出现连续输出,如下。每列只有5个单位,故原本“seven”就该停止却因为没有 '\0' 而读取到下一行“eight”一直到“nine”才停下。同样还有上文提到的数组地址。 菜鸟记录:c语言实现PAT甲级1005--Spell It Right
  •  字符与数字的转换。
  • 停止条件的巧妙使用,如这里for循环采用sum=0停止的条件,是我个人之前没看过的。

  

                                                                                                         

 

原文链接:https://www.cnblogs.com/whf10000010/p/17360701.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:菜鸟记录:c语言实现PAT甲级1005–Spell It Right - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月28日

相关文章

  • 2019年滴滴出行前端工程师面试题(附答案)

    下面是详细讲解“2019年滴滴出行前端工程师面试题(附答案)”的完整攻略。 理解面试题意思 首先,要认真阅读所有面试题目,并理解每个问题的意思。针对每个问题,需要理解问题的背景、要求和解决方案。在阅读问题时,可以结合实际场景或者经验,尝试通过自己的思考,预测和解答面试官可能会继续提问的问题。 例如,题目中的第一个问题:“如何实现一个模块加载器?”,我们可以针…

    C 2023年5月23日
    00
  • C++ 动态规划算法使用分析

    C++ 动态规划算法使用分析 什么是动态规划算法 动态规划算法是一种通过拆分问题为更小的子问题来解决复杂问题的算法。它通常用于优化问题。 动态规划与分治算法类似,都是将问题拆分为更小的子问题来解决。但是,动态规划算法是通过将已解决的子问题存储在内存中,以避免重复计算,提高性能。 动态规划算法的应用 动态规划算法在诸如优化搜索、数据压缩、无序序列问题、游戏策略…

    C 2023年5月23日
    00
  • C语言制作简易金山打字通功能的代码

    制作简易金山打字通功能的代码可以分为以下几个步骤: 1. 安装必要的工具 为了能够编写并编译出C语言程序,我们需要先安装一些必要的工具。这些工具包括: 文本编辑器:例如Notepad++、Sublime Text等,可以用于编写代码。 GCC编译器:GCC是一套广泛使用的C语言编译器,可用于编译源代码并生成可执行文件。 Make工具:Make工具可用于自动化…

    C 2023年5月24日
    00
  • Python实现利用最大公约数求三个正整数的最小公倍数示例

    下面为大家讲解一篇“Python实现利用最大公约数求三个正整数的最小公倍数”的攻略。 概述 我们需要使用Python语言来实现最小公倍数(LCM)的计算。但是,要计算LCM,首先需要计算最大公约数(GCD)。本教程介绍了计算三个正整数的LCM的方法,其中使用了最大公约数概念。 算法说明 计算三个数字的LCM的算法如下:1. 计算第一个数字和第二个数字的最大公…

    C 2023年5月22日
    00
  • Marshall Monitor II A.N.C.降噪蓝牙耳机30天详细评测

    Marshall Monitor II A.N.C.降噪蓝牙耳机30天详细评测 概述 本文介绍Marshall Monitor II A.N.C.降噪蓝牙耳机的使用体验,并根据30天的长时间使用给出评测。 外观设计 Marshall Monitor II A.N.C.耳机采用了传统的翻盖式设计,整个耳机以黑色为主色调,搭配铜色的镀金LOGO,非常时尚。耳机外…

    C 2023年5月22日
    00
  • Matlab实现贪吃蛇小游戏的示例代码

    下面我将为你详细讲解使用MATLAB来实现一个贪吃蛇小游戏的完整攻略。 1. 准备工作 在实现贪吃蛇小游戏之前,我们需要准备以下工作: 安装MATLAB 确保你已经在你的电脑上安装了MATLAB。 了解MATLAB绘图函数 了解如何使用MATLAB绘图函数(如“plot”函数)来进行坐标点绘制。 了解MATLAB定时器 了解如何使用MATLAB定时器(“ti…

    C 2023年5月24日
    00
  • C++ cmake实现日志类的示例代码

    C++ cmake实现日志类的示例代码攻略 前置要求 安装cmake工具:在官网 https://cmake.org/download/ 下载对应系统的版本进行安装 C++编译器:这里以g++为例 IDE:这里以Visual Studio Code为例 步骤一:创建工程 利用cmake工具创建一个C++工程。 在项目根目录创建文件CMakeLists.txt…

    C 2023年5月23日
    00
  • C#中Json反序列化的实现方法

    C#中我们可以使用Json反序列化来将Json字符串转换成对应的对象。下面介绍C#中Json反序列化的实现方法: 准备工作 在进行Json反序列化前,我们需要引入Newtonsoft.Json库。使用NuGet包管理器进行安装,或者手动下载该库进行引入。 Install-Package Newtonsoft.Json -Version 13.0.1 反序列化…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部