pta乙级练习第二题提问

初学者。

题目如下

代码如下

#include<iostream>
#include<math.h>
#include <string.h>
#include <stdlib.h>
using namespace std;

char * hanyu(int a);
char * hanyu1(int a);
static char r[100];

int main()
{
	int n;
	int sum=0;
	double p=pow(10,100);
	cin>>n;
	
	if(n>p) cout<<"输入错位";
	else 
	
	while(n!=0){                 
		sum+=n%10;                // 计算其各位数字之和
		n/=10;
	}
	
	cout<<sum<<endl;             //  检查结果 
	
	int a;
	int mid=sum;                //辅助计算的中间量
	
	for(a=0;mid>0;a++){          //计算结果的位数 
		mid/=10;        
	}	
	cout<<a<<endl;
	
	int x=pow(10,a-1);           // 设置一个10的a次方用来取最高位数字 
	int res;                     //中间量 
	
	while(sum>0){             
        res=sum/x;               // 取最高位数字 
        cout<<hanyu(res);        // 输出最高位数字拼音 
        sum=sum%x;               // 去掉最高位数字 
		x/=10;                    
		if(sum<10) {            //最后一位拼音去掉后面空格 
		cout<<hanyu1(sum);
		sum/=10;      
       }            
	}
}

char * hanyu(int a)
{   
	switch(a){
		case 1:
			strcpy(r,"yi ");
			break;
		case 2:
			strcpy(r,"er ");
			break;
		case 3:
			strcpy(r,"san ");
			break;
        case 4:
			strcpy(r,"si ");
			break;
		case 5:
			strcpy(r,"wu ");
			break;
		case 6:
			strcpy(r,"liu ");
			break;
		case 7:
			strcpy(r,"qi ");
			break;
		case 8:
			strcpy(r,"ba ");
			break;
		case 9:
			strcpy(r,"jiu ");
			break;
		case 0:
		    strcpy(r,"ling ");
		    break;
	}
	return r;
}

char * hanyu1(int a)
{
	switch(a){
		case 1:
			strcpy(r,"yi");
			break;
		case 2:
			strcpy(r,"er");
			break;
		case 3:
			strcpy(r,"san");
			break;
        case 4:
			strcpy(r,"si");
			break;
		case 5:
			strcpy(r,"wu");
			break;
		case 6:
			strcpy(r,"liu");
			break;
		case 7:
			strcpy(r,"qi");
			break;
		case 8:
			strcpy(r,"ba");
			break;
		case 9:
			strcpy(r,"jiu");
			break;
		case 0:
		    strcpy(r,"ling");
		    break;
	}
	return r;
}

结果只能正确计算到n为9位数的,结果如下

如果n超过了9位数后就错误了,如下

麻烦各位大佬帮忙看看问题出在哪里,谢谢

问题给你找到了。

// 问题在这里,你没有加大括号
if (sum < 10)               //最后一位拼音去掉后面空格 
    cout << hanyu1(sum);
sum /= 10;



// 解决:
if (sum < 10) {              //最后一位拼音去掉后面空格 
    cout << hanyu1(sum);
    sum /= 10;
}

但是这样有两个BUG,

第一:当输入的个位数,后面还会紧接着输出个ling

解决BUG:while循环中加上这一句代码:if (x < 10) return 0;

第二:当输入的是三位数108时,零会被抹掉,仅输出yi ba

暂时没有想到如何解决,但是我给你写了另一个实现方式。

vector<int> score;
	while (sum > 0) {
		score.push_back(sum % 10);	// 将个位数插入容器中
		sum /= 10;
	}

	int i = score.size() - 1;
	for (; i >= 0; i--) {
		if (i == 0) {
			cout << hanyu1(score.at(i));
			break;
		}
		cout << hanyu(score.at(i));
	}

这样比你那种写法简单得多。

下面是你的全部代码:

#include<iostream>
#include<math.h>
#include <string.h>
#include <stdlib.h>
#include <vector>

using namespace std;

char * hanyu(int a);
char * hanyu1(int a);
static char r[100];

int main() {
	long long n = 0;
	int sum = 0;
	double p = pow(10, 100);
	cin >> n;

	if (n > p) cout << "输入错位";
	else

		while (n != 0) {
			sum += n % 10;                // 计算其各位数字之和
			n /= 10;
			cout << "sum = " << sum << "   n = " << n << endl;
		}

	cout << "sum = " << sum << endl;             //  检查结果 

	int a;
	int mid = sum;                //辅助计算的中间量

	for (a = 0; mid > 0; a++) {          //计算结果的位数 
		mid /= 10;
	}
	cout << "a = " << a << endl;

	int x = (int)pow(10, a - 1);           // 设置一个10的a次方用来取最高位数字 
	cout << "x = " << x << endl;
	int res;                     //中间量 

	//while (sum > 0) {
	//	res = sum / x;               // 取最高位数字 
	//	cout << hanyu(res);        // 输出最高位数字拼音 
	//	
	//	//if (x < 10) return 0;

	//	sum = sum % x;               // 去掉最高位数字  /*** BUG ***/
	//	x /= 10;
	//	if (sum < 10) {              //最后一位拼音去掉后面空格 
	//		cout << hanyu1(sum);
	//		sum /= 10;
	//	}
	//}


	vector<int> score;
	while (sum > 0) {
		score.push_back(sum % 10);	// 将个位数插入容器中
		sum /= 10;
	}

	int i = score.size() - 1;
	for (; i >= 0; i--) {
		if (i == 0) {
			cout << hanyu1(score.at(i));
			break;
		}
		cout << hanyu(score.at(i));
	}
}

char * hanyu(int a) {
	switch (a) {
		case 1:
			strcpy_s(r, "yi ");
			break;
		case 2:
			strcpy_s(r, "er ");
			break;
		case 3:
			strcpy_s(r, "san ");
			break;
		case 4:
			strcpy_s(r, "si ");
			break;
		case 5:
			strcpy_s(r, "wu ");
			break;
		case 6:
			strcpy_s(r, "liu ");
			break;
		case 7:
			strcpy_s(r, "qi ");
			break;
		case 8:
			strcpy_s(r, "ba ");
			break;
		case 9:
			strcpy_s(r, "jiu ");
			break;
		case 0:
			strcpy_s(r, "ling ");
			break;
	}
	return r;
}

char * hanyu1(int a) {
	switch (a) {
		case 1:
			strcpy_s(r, "yi");
			break;
		case 2:
			strcpy_s(r, "er");
			break;
		case 3:
			strcpy_s(r, "san");
			break;
		case 4:
			strcpy_s(r, "si");
			break;
		case 5:
			strcpy_s(r, "wu");
			break;
		case 6:
			strcpy_s(r, "liu");
			break;
		case 7:
			strcpy_s(r, "qi");
			break;
		case 8:
			strcpy_s(r, "ba");
			break;
		case 9:
			strcpy_s(r, "jiu");
			break;
		case 0:
			strcpy_s(r, "ling");
			break;
	}
	return r;
}