• PAT甲级刷题实录——1005


    原题链接

    https://pintia.cn/problem-sets/994805342720868352/problems/994805519074574336

    思路

    这题相对比较简单,就是逐个读入数字然后加起来,算出来的总和从最高位开始逐位用英文输出。需要注意的是,题中所给的数字是连在一起的,没有用空格隔开,而如果直接用cin会把一整串数字都读进去,这不是我们想要的。逐个字符读入需要用到的是cin.get()方法。不过这样读进来的是char类型,如果用int输出相当于输出各个数字对应的ASCII码。我们需要将它转换成int类型,如果记得住数字对应的ASCII值比数字多48,就可以直接减48,如果记不住也可以用num = c - '0'来转换,其中num是int类型,c是char类型。关于什么时候停止读取,网上给的是cin.get()) != EOF,不过我试了一下,发现PAT的输入最后还有一位换行符,如果只有EOF来判断,那么最后还会读入换行符对应的ASCII值10。因此我们需要再加一个判断即(c = cin.get()) != EOF && c!=10

    读入的同时进行累加运算,读完所有数字后就已经得到了它们的总和。题目中要求从最高位开始逐位用英文输出。先解决英文输出的问题,这个简单,写一个方法专门进行转换即可。如何从最高位开始输出,我目前没有想到直接从最高位开始输出的方法,但我知道怎么从最低位开始输出,只要每次取模10后的结果并且再将总和自身除以10即可。我可以把从最低位开始的每位数字存在vector中,之后倒序输出即可。代码如下:

    代码

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    string transfer(int digit);
    int main()
    {
    	char c;
    	int num,sum=0;
    	vector<int> result;
    	while ((c = cin.get()) != EOF && c!=10)
    	{
    		num = c - '0';
    		sum += num;	//累加计算总和
    	}
    	if (sum == 0)	//考虑总和为0的情况,此时直接输出zero
    	{
    		cout << "zero";
    		return 0;
    	}
    	while (sum != 0)
    	{
    		result.push_back(sum % 10);	//从个位开始一位位往vector中添加数字
    		sum /= 10;
    	}
    	for (int i = result.size() - 1; i >= 0; i--)	//倒序输出vector
    	{
    		if (i == result.size() - 1)
    			cout << transfer(result[i]);
    		else
    			cout << ' ' << transfer(result[i]);
    	}
    	return 0;
    }
    string transfer(int digit)	//阿拉伯数字和英文转换器
    {
    	switch (digit)
    	{
    	case 0:
    		return "zero";
    		break;
    	case 1:
    		return "one";
    		break;
    	case 2:
    		return "two";
    		break;
    	case 3:
    		return "three";
    		break;
    	case 4:
    		return "four";
    		break;
    	case 5:
    		return "five";
    		break;
    	case 6:
    		return "six";
    		break;
    	case 7:
    		return "seven";
    		break;
    	case 8:
    		return "eight";
    		break;
    	case 9:
    		return "nine";
    		break;
    	default:
    		break;
    	}
    	return "NaN";	//用不到,但函数必须得有返回值
    }
    

    一开始我没有考虑总和一开始就为0的情况,所以有一个测试点过不去。之后加上了一条专门判断总和是否为0的语句。

  • 相关阅读:
    yum安装nginx没有某一模块,该如何添加第三方模块?
    二进制部署K8S集群(二十四)k8s技术点整理
    opencv在python和c#中的对照应用-文字区域识别
    小区配置地图中心坐标
    Exception: No supported Visual Studio can be found. Supported versions are: 16.0 (2019), 15.0 (2017)
    文件包含
    kali linux 安装lanmp遇到的问题
    嵌入式实操----基于RT1170 首板硬件之SDRAM调试(十二)
    嵌入式实操----基于RT1170 DCD数据开发入门记录(十一)
    嵌入式实操----基于RT1170解决串口不支持float类型打印问题(十)
  • 原文地址:https://www.cnblogs.com/aopstudio/p/12202320.html
Copyright © 2020-2023  润新知