PAT 1002 写出这个数
题目:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string input;
string temp;
int sum = 0;
vector<string> output{"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
cin>>input;
for(int i = 0;i < (int)input.size();++i){
temp = input.substr(i,1);//利用substr抓取input指定位置\指定长度的内容
int a = stoi(temp);//使用stoi将 字符串-->数字
sum += a;
}
vector<int> num;
int digit = 0;
while(sum != 0){
num.push_back(sum%10);//从个位开始,添加到num中去
sum /= 10;
++digit;
}
for(int i = digit - 1;i > 0;--i){
cout<< output[num[i]] <<" ";//输出对应的字符
}cout<<output[num[0]];//由于题目要求最后不能空格,输出最后做一个修改
return 0;
}
解析:
将输入存为字符串,便于存取大数,同时按位进行操作求得各项之和.得出各位之值,查数组输出结果.
关于substr():
- 用途:一种构造string的方法
- 形式:s.substr(pos, n)
- 解释:返回一个string,包含s中从pos开始的n个字符的拷贝(pos的默认值是0,n的默认值是s.size() - pos,即 不加参数会默认拷贝整个s )
- 补充:若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾
关于stoi():
- 用途: 将指定开头的字符串修改为指定进制(
2
10
16
auto
) 的数字(默认为10进制)- 形式:
int stoi (const string& str, size_t* idx = 0, int base = 10); int stoi (const wstring& str, size_t* idx = 0, int base = 10);
- eg:
int i_dec = std::stoi (str_dec,&sz); int i_hex = std::stoi (str_hex,nullptr,16); int i_bin = std::stoi (str_bin,nullptr,2); int i_auto = std::stoi (str_auto,nullptr,0); //stoi(s)也可以,直接默认全部以 十进制 转换