菜鸟记录: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日

相关文章

  • C语言预处理预编译命令及宏定义详解

    C语言预处理预编译命令及宏定义详解 C语言中有一种预处理器,可以利用预处理指令在编译之前进行文本替换、宏定义、条件编译等操作,这种预处理器就是C语言预处理器。本文将介绍C语言预处理器的使用方法和一些常见的预处理命令及宏定义的详解。 预处理命令 C语言预处理器使用一些特殊的指令进行预处理,下面列举了一些常见的预处理命令: include #include &l…

    C 2023年5月23日
    00
  • 一篇文章带你实现C语言中常用库函数的模拟

    一篇文章带你实现C语言中常用库函数的模拟 在学习C语言的过程中,我们经常会用到一些常用的库函数,比如字符串处理函数strlen()、内存处理函数memcpy()等等。这些库函数能够方便地完成一些操作,但我们有时候需要自己手动实现这些函数,以便更好地理解它们的原理和实现方法。本文将带你实现C语言中常用库函数的模拟。 1. strlen() 功能描述 strle…

    C 2023年5月23日
    00
  • 如何利用C语言实现最简单的HTTP服务器详解

    标题:如何利用C语言实现最简单的HTTP服务器详解 介绍 本教程将向你展示如何使用C语言来实现一个最简单的HTTP服务器。HTTP(超文本传输协议)是用于在Web上传输数据的基本协议。实现HTTP服务器的基本思想是接受来自客户端(Web浏览器、爬虫等)的HTTP请求,解析出请求的内容,然后向客户端返回HTTP响应(HTML页面、图片等)。本教程假设您已经了解…

    C 2023年5月22日
    00
  • C++内存管理详细解析

    C++内存管理详细解析攻略 C++是一门广泛使用的高级编程语言,内存管理是C++程序设计中的重要内容。C++内存管理涉及到内存的分配、使用和释放。本文将对C++内存管理进行详细解析,并提供两个代码示例作为补充。 堆栈内存分配方式 C++内存主要有两种分配方式,分别是堆内存和栈内存。堆内存由程序员手动分配和释放,而栈内存由系统自动分配和释放。 堆内存 程序员手…

    C 2023年5月23日
    00
  • .NET(C#)连接各类数据库代码-集锦

    . 前言 本文将为大家介绍如何使用.NET (C#)代码连接各种不同类型的数据库。无论是关系型数据库,还是NoSQL数据库,本文都将为您提供一条清晰明了的攻略。本文例举了连接MySQL和MongoDB两个数据库的示例,以供读者参考和学习。 . 连接MySQL数据库 连接MySQL数据库可以使用MySQL官方提供的Connector/NET组件,该组件提供了与…

    C 2023年5月22日
    00
  • C语言 数组中重复的数字分析及方法

    C语言数组中重复的数字分析及方法 问题描述 在一个长度为n的数组中,所有的数字都在0~n-1的范围内,数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字。 思路分析 方法1:暴力遍历 最简单的方法是使用两个循环,从头到尾依次比较每个数字是否重复,时间复杂度为O(n^2)。 方法2:哈希表 哈希表可以将…

    C 2023年5月22日
    00
  • jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)

    下面是关于“jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)”的完整攻略: 1. 前言 首先,这里需要明确一点,这篇攻略介绍的是如何使用jQuery自定义图片缩放拖拽插件imageQ。如果你还不了解什么是jQuery,请先学习一下基础知识。 该插件可用于任何需要在网页中实现图片缩放和拖拽的场景,例如放大镜、海报展示、照片墙等。 2…

    C 2023年5月23日
    00
  • C++进一步认识类与对象

    C++进一步认识类与对象 类与对象是什么? 在 C++ 中,类是一种自定义的数据类型,它可以封装数据和函数。每个类都可以实例化出多个对象,这些对象都有共同的数据类型和函数行为,称为类的实例或对象。 类的定义 定义一个类,需要确定以下内容: 类的名称 类的数据成员 类的成员函数 下面是一个简单的类的定义: class Box { public: double …

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