在平时的acm中很容易见到数据类型需要在数字和字符之间转换的问题,我以一个简单的编程题来说一下这个问题。
问题描述:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
思路:我们知道加入我们以一个string类型存储这个数,这个“数字”的每一位就好拿出来,进行累加。然后再将累加的数每一位拆开,让它按照对应的拼音输出即可。
可能遇到的问题:首先,以string类型存储数字后,每一位上存储的是一个字符而不是数字,所以如果直接使用‘+’会产生错误(但编译时候不会报错);其次,累加之后数据类型应该是一个int型的,按照我们的思路,对应拼音输出的时候应该是字符。
关键点:
涉及到了两次类型转换。一次是在计算各位之和的时候,一次是在对应拼音输出结果的时候。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
void judge(char num){
switch (num){
case '0':
cout <<"ling";
break;
case '1':
cout << "yi";
break;
case '2':
cout << "er";
break;
case '3':
cout << "san";
break;
case '4':
cout << "si";
break;
case '5':
cout << "wu";
break;
case '6':
cout << "liu";
break;
case '7':
cout << "qi";
break;
case '8':
cout << "ba";
break;
case '9':
cout << "jiu";
break;
}
}
int main(){
string n;
stringstream ss;
cin >> n;
int sum=0;
for(int i=0;i<n.length();++i){
sum =sum +( n[i]-'0'); //将char转换成int,进行累加;
}
ss << sum;
string s = ss.str(); //将int转换成string,方便取出每一位上的字符;
for(int j=0;j<s.length();++j){
judge(s[j]);
if(j!=s.length()-1)
cout << " ";
}
return 0;
}
具体的算法实现很简单,主要说一下在这个过程中用到的两种转化方法。
第一种:
用到了ASCII码。(ASCII表我就不列了,网上有很多。)简单来说就是:char型的要转换成int型的,ASCII码差了一个‘0’的距离。
eg:char型转化成int
char s=‘1234’;
int a;
a = s - '0';//这就是实现了char型向int转化;
int 转化成char:
int a = 123445;
char s;
s = a+'0';
第二种:
用包含在sstream库中的stringstream。简单来说stringstream的作用就是它吃进去一个类型,然后给你吐出来另一个你想要的类型。
stringstream ss;
int a = 1234;
ss << a;
string s = ss.str(); //s此时就是一个字符串类型的了;
关于这个题的解法肯定还有更简单的,这里不过多研究,主要是为了简单说明一下这两个类型之间的转化问题。