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 pip install后修改模块路径,import失败,需要在哪里修改环境变量?
  • ¥15 爬取1-112页所有帖子的标题但是12页后要登录后才能 我使用selenium模拟登录 账号密码输入后 会报错 不知道怎么弄了
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline