PAT 乙级1002

菜鸡的C/C++复健之路——PAT刷题篇

-----此贴只是个人刷PAT的记录与总结,不用做任何商业用途,转载请告知。

PAT 乙级1002 写出这个数 (20分)

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

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

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

输入样例:
1234567890987654321123456789
输出样例:
yi san wu

思路

#include<iostream>
#include<string>
using namespace std;

//计算一串数字的总和
int calculate(string n) {
    int sum = 0;
	size_t t;								//这里不用int型,是因为for循环里
	for (t = 0; t < n.length(); t++) {	  	//n.length()是一个unsigned integer
		sum += (n[t] - '0');				//而int t是signed integer
	}
	return sum;
}

//将整数转化成string类型,并匹配相应的拼音字符
string transfrom(int n) {	
    size_t  t,m;
	string A[] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	string B;
	string C = to_string(n);
	for (t = 0; t < C.length(); t++) {
		m = C[t] - '0';
		B.append(A[m] + " ");				//append()拼接之后不带空格
	}										
	B.erase(B.length() - 1, 1);				//消去结果中最后一个空格
	return B;
}

int main() {
	int t;
	string A, n;
	cin >> n;
	t = calculate(n);
	A = transfrom(t);
	cout << A;
	return 0;
}

另外一个使用栈的版本:

相关知识补充

一、A warning - comparison between signed and unsigned integer expressions [-Wsign-compare].此警告是因为signed 和unsigned数据的范围不同。
解决的办法是:

A.使用for(vector::size_type t = 0; t<C.length(); t++),其中Point2f是C.length()的数据类型;size_type是由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型。

B.使用for(std::size_t t = 0; t<C.length(); t++),其中size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。(参考自一个大佬原文链接

C.将C.length()强制转化为signed int: for(std::size_t t = 0; t<(int)C.length(); t++)

二、string类
此处参考自本站另外一个大佬,原文里几乎详尽了C++的string类用法。
附上链接:https://blog.csdn.net/qq_30534935/article/details/82227364?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值