初学者。
题目如下
代码如下
#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;
}