Noob4 2021-03-10 14:34 采纳率: 100%
浏览 65
已采纳

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位数后就错误了,如下

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

  • 写回答

1条回答 默认 最新

  • cpp_learners 2021-03-10 15:37
    关注

    问题给你找到了。

    // 问题在这里,你没有加大括号
    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;
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划