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

yizhihongxing

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

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日

相关文章

  • 如何处理json中不带双引号的key的问题

    如果遇到JSON中不带双引号的key时,通常会遇到解析器无法将JSON字符串解析成JSON对象的问题。 下面是处理这个问题的几种方法: 1.将JSON字符串中的单引号替换成双引号 可以通过将JSON字符串中的单引号替换成双引号来解决这个问题。这可以使用正则表达式和字符串的replace()方法来实现。 以下是一个示例: const jsonObj = JSO…

    C 2023年5月23日
    00
  • 浅谈C++空间配置器allocator

    浅谈C++空间配置器allocator 什么是空间配置器allocator C++中的空间配置器allocator是在使用new/delete进行内存管理的时候,对内存进行分配和释放的一种通用工具。allocator的主要目的是为了解决C++标准库中容器和算法在内存管理方面的低效问题。C++标准库提供了多个类型的allocator,可以满足不同场景下的需求。…

    C 2023年5月22日
    00
  • C语言中如何进行跨平台开发?

    C语言是一种跨平台编程语言,因为它的编译器可以在不同的操作系统上进行编译。然而,由于操作系统本身的不同,开发跨平台应用程序的过程可能会涉及不同的挑战。以下是C语言进行跨平台开发的完整攻略: 选择跨平台的库和框架 一些跨平台库和框架可以帮助开发者更轻松地在不同平台之间移植代码,避免特定于平台的依赖关系。例如,QT是一个开源跨平台GUI框架,可以用于开发Wind…

    C 2023年4月27日
    00
  • Sublime Text 3 实现C语言代码的编译和运行(示例讲解)

    下面我将详细讲解一下“Sublime Text 3 实现C语言代码的编译和运行(示例讲解)”的完整攻略。 前提条件 在开始这个攻略之前,我们需要做好以下准备工作: 安装Sublime Text 3; 安装C语言编译器; 在Sublime Text 3中安装Package Control; 安装Package Control Package Control 是…

    C 2023年5月23日
    00
  • C语言实现学生信息管理程序

    让我来详细讲解“C语言实现学生信息管理程序”的攻略。 概述 学生信息管理程序是一个非常基础的程序,它主要实现如下功能: 添加学生信息 查询学生信息 修改学生信息 删除学生信息 开发学生信息管理程序可以加强我们对C语言基础知识的掌握,例如指针、结构体等等。 开发步骤 1. 创建学生信息结构体 首先,我们需要创建一个结构体来存储学生信息。结构体可以包含学生的姓名…

    C 2023年5月22日
    00
  • C++的程序流程结构你了解多少

    C++程序的流程结构是指程序的执行顺序和执行条件,程序流程结构分为顺序结构、选择结构和循环结构。 顺序结构 顺序结构是C++程序中最简单的结构,它是指按顺序执行的结构。当程序中只有一条语句时,就是顺序结构。 示例1: #include <iostream> using namespace std; int main() { // 输出Hello …

    C 2023年5月23日
    00
  • loadavg数据异常引发问题起源分析

    当我们使用Linux系统时,经常会使用命令top查看系统状态。其中有一项很重要的指标就是load average(平均负载)。load average是指单位时间内系统运行队列中的平均进程数,是衡量系统负荷程度的最基本指标之一。 但是在实际应用中,常常会遇到load average数据异常的问题。这会导致系统运行缓慢,处理能力减弱,甚至会导致系统崩溃。那么如…

    C 2023年5月22日
    00
  • C语言实现ATM机存取款系统

    C语言实现ATM机存取款系统 介绍 本文将介绍如何使用C语言实现一个简单的ATM机存取款系统。该系统包括用户登录、查询余额、存款、取款等基本功能。我们将使用C语言编写程序,使用结构体、函数、文件存储等技术实现系统的各项功能。 准备 在开始编写程序之前,需要确保您已经安装了C语言编译器。您可以选择常用的编译器,例如gcc或者Visual Studio等。本文将…

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