PTA练习题
5.英文按位输出非负整数N各位之和
小编整体思路为先求和sum,再反序sum为reverse,即可从最后一位开始按位输出想要的结果。过程中有如下几个问题:
(1)题目中N范围为0~10e100,存在大数存储的问题,因此用字符串存储,再按位整数化加到sum上。
(2)sum结果会为0结尾,个数不定,因此反序时要考虑到,计数后输出时根据计数输出相应个数的zero。
(3)就不该想着翻转,直接正序存到字符串数组再倒序输出就没这么多事了
#include <iostream>
using namespace std;
#define ZERO "zero";
#define ONE "one";
#define TWO "two";
#define THREE "three";
#define FOUR "four";
#define FIVE "five";
#define SIX "six";
#define SEVEN "seven";
#define EIGHT "eight";
#define NINE "nine";
void show(int); //输出函数
int main(){
int sum = 0; //各位和初始为0
int sum_endwithzero = 0; //sum结尾为0的个数
int reverse = 0; //各位和的倒序数初始为0
int digit = 0; //输出时用
string n;
cin >> n;
for(int i = 0;i < n.length();i++){
sum += (n.substr(i,i + 1)[0] - '0');
}//每位转int加到sum上
if(sum == 0){
show(0);
}//输入0时单独结算
for(int tmp = sum;tmp != 0;tmp /= 10){
if(tmp % 10 == 0){
sum_endwithzero += 1;
}
}//sum末尾存在n个0时,标记
for(;sum != 0;){
reverse = 10 * reverse + sum % 10;
sum /= 10;
}//reverse为反序sum,便于输出
for(;reverse != 0;){
digit = reverse % 10;
reverse /= 10;
show(digit);
if(reverse != 0){
cout << " ";
}
if((reverse == 0)&&(sum_endwithzero != 0)){
for(int i = 0;i < sum_endwithzero;i++){
cout << " ";
show(0);
}
}//因为reverse为sum反序,根据sum末尾0的个数输出zero
}
return 0;
}
void show(int a){
switch(a){
case 0 :
cout << ZERO;
break;
case 1 :
cout << ONE;
break;
case 2 :
cout << TWO;
break;
case 3 :
cout << THREE;
break;
case 4 :
cout << FOUR;
break;
case 5 :
cout << FIVE;
break;
case 6 :
cout << SIX;
break;
case 7 :
cout << SEVEN;
break;
case 8 :
cout << EIGHT;
break;
case 9 :
cout << NINE;
break;
}
}