菜鸡的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