/* 2151895 信09 黑文冉 */
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x;
cout << "请输入一个[0-100亿]之间的数字 : " << endl;
cin >> x;
x = x + 1e-5;
int a = x / 1000000000;
a = (int)a;
if (x != 0) {
switch (a) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int b = x / 100000000 - a * 10;
b = (int)(b);
if (x != 0) {
switch (b) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int c = x / 10000000 - a * 100 - b * 10;
c = (int)(c);
if (x != 0) {
switch (c) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int d = x / 1000000 - a * 1000 - b * 100 - c * 10;
d = (int)(d);
if (x != 0) {
switch (d) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int e = x / 100000 - a * 10000 - b * 1000 - c * 100 - d * 10;
e = (int)(e);
if (x != 0) {
switch (e) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int f = x / 10000 - a * 100000 - b * 10000 - c * 1000 - d * 100 - e * 10;
f = (int)(f);
if (x != 0) {
switch (f) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int g = x / 1000 - a * 1000000 - b * 100000 - c * 10000 - d * 1000 - e * 100 - f * 10;
g = (int)(g);
if (x != 0) {
switch (g) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int h = x / 100 - a * 10000000 - b * 1000000 - c * 100000 - d * 10000 - e * 1000 - f * 100 - g * 10;
h = (int)(h);
if (x != 0) {
switch (h) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int i = x / 10 - a * 100000000 - b * 10000000 - c * 1000000 - d * 100000 - e * 10000 - f * 1000 - g * 100 - h * 10;
i = (int)(i);
if (x != 0) {
switch (i) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int j = x - a * 1000000000 - b * 100000000 - c * 10000000 - d * 1000000 - e * 100000 - f * 10000 - g * 1000 - h * 100 - i * 10;
j = (int)(j);
if (x != 0) {
switch (j) {
case 1:
cout << "壹" << endl;
break;
case 2:
cout << "贰";
break;
case 3:
cout << "叁";
break;
case 4:
cout << "肆";
break;
case 5:
cout << "伍";
break;
case 6:
cout << "陆";
break;
case 7:
cout << "柒";
break;
case 8:
cout << "捌";
break;
case 9:
cout << "玖";
break;
}
}
int k = x - a * 1000000000 - b * 100000000 - c * 10000000 - d * 1000000 - e * 100000 - f * 10000 - g * 1000 - h * 100 - i * 10 - j;
int l = k * 100;
int m = l / 10 % 10;
int n = l % 10;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
void funcOutDigit(int nDigit){
switch(nDigit){
case 1:
cout<<"壹";
break;
case 2:
cout<<"贰";
break;
case 3:
cout<<"叁";
break;
case 4:
cout<<"肆";
break;
case 5:
cout<<"伍";
break;
case 6:
cout<<"陆";
break;
case 7:
cout<<"柒";
break;
case 8:
cout<<"捌";
break;
case 9:
cout<<"玖";
break;
default:
break;
}
}
int main()
{
double x;
cout << "请输入一个[0-100亿]之间的数字 : " << endl;
cin >> x;
//不知道你的先导3-b3是什么代码?所以就先不考虑。
//按你的题意,对输入浮点数的范围、格式和错误校验不考虑。
//按你的题意,对小于零和大于等于100亿的情况不处理。
int nDigit,nZeroCount;
long long nIntPart,nFracPart;
nIntPart= floor(x);
nFracPart=((long)((x-nIntPart)*1000))%1000;
nFracPart=(nFracPart+1)/10;
//整数部分
if(nIntPart>=1000000000){
nDigit =nIntPart/1000000000;
funcOutDigit(nDigit); //如果不让用函数,就把这行用funcOutDigit函数里的代码直接替换就可以。下同。
cout <<"拾";
}
if(nIntPart>=100000000){
nDigit =nIntPart%1000000000/100000000;
funcOutDigit(nDigit);
cout <<"亿";
}
nZeroCount=0;
if(nIntPart>=10000000){
nDigit =nIntPart%100000000/10000000;
if(nDigit>0){
funcOutDigit(nDigit);
cout <<"千";
}else
nZeroCount=1;
}
if(nIntPart>=1000000){
nDigit =nIntPart%10000000/1000000;
if(nDigit>0){
if(nZeroCount>0){
cout <<"零";
nZeroCount=0;
}
funcOutDigit(nDigit);
cout <<"百";
}else
nZeroCount++;
}
if(nIntPart>=100000){
nDigit =nIntPart%1000000/100000;
if(nDigit>0){
if(nZeroCount>0){
cout <<"零";
nZeroCount=0;
}
funcOutDigit(nDigit);
cout <<"拾";
}else
nZeroCount++;
}
if(nIntPart>=10000){
nDigit =nIntPart%100000/10000;
if(nDigit>0){
if(nZeroCount>0){
cout <<"零";
nZeroCount=0;
}
funcOutDigit(nDigit);
}
if(nZeroCount==3)
nZeroCount++;
else{
cout <<"万";
nZeroCount=0;
}
}
if(nIntPart>=1000){
nDigit =nIntPart%10000/1000;
if(nDigit>0){
if(nZeroCount>0){
cout <<"零";
nZeroCount=0;
}
funcOutDigit(nDigit);
cout <<"千";
}else
nZeroCount++;
}
if(nIntPart>=100){
nDigit =nIntPart%1000/100;
if(nDigit>0){
if(nZeroCount>0){
cout <<"零";
nZeroCount=0;
}
funcOutDigit(nDigit);
cout <<"佰";
nZeroCount=0;
}else
nZeroCount++;
}
if(nIntPart>=10){
nDigit =nIntPart%100/10;
if(nDigit>0){
if(nZeroCount>0){
cout <<"零";
nZeroCount=0;
}
funcOutDigit(nDigit);
cout <<"拾";
}else
nZeroCount++;
}
if(nIntPart>=1){
nDigit =nIntPart%10;
if(nDigit>0){
if(nZeroCount>0){
cout <<"零";
nZeroCount=0;
}
funcOutDigit(nDigit);
}
}
if(nIntPart==0)
cout <<"零";
cout <<"圆";
//小数部分
if(nFracPart==0){
cout <<"整";
}else{
if(nFracPart>=10){
nDigit =nFracPart%100/10;
funcOutDigit(nDigit);
cout <<"角";
}else
cout <<"零";
if(nFracPart%10>0){
nDigit =nFracPart%10;
funcOutDigit(nDigit);
cout <<"分";
}else{
cout <<"整";
}
}
cout <<"\n\n";
system("Pause");
return 0;
}
你把思路理清楚了,代码自然能写出来,提供一下思路
数字转人名币大写,遍历每一位数字,进行以下规则判断处理
追加数字:
什么时候追加 数字? 遍历当前位不为0
什么时候追加 零? 遍历当前位不为0, 并且非角分位,并且前一位为0
追加单位:
什么时候追加 亿? 大于1亿
什么时候追加 万? 大于1万 且 万这一段不为0
什么时候追加 元? 大于1元
什么时候追加 "拾","佰","仟"? 遍历当前位 对应该单位 且不为0
什么时候追加 "角"? 遍历当前位 对应该单位 且不为0
什么时候追加 "分"? 遍历当前位 对应该单位 且不为0
追加整:
什么时候追加 "整"? 分位不为0
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//检查字符串合法性
bool judge_isnum(string input){
bool is_num = true;
if(input[0] = '-')
input = input.erase(0, 1);
for (int i = 0; i < input.length(); i++){
if (input[i] == '.'){
input = input.erase(i, 1);
break;
}
}
for (int i = 0; i < input.length(); i++){
if (input[i] < '0' || input[i] > '9'){
is_num = false;
break;
}
}
return is_num;
}
// 将数字转换为大写
string get_c(int c){
switch(c){
case 0: return "零";
case 1: return "壹";
case 2: return "贰";
case 3: return "叁";
case 4: return "肆";
case 5: return "伍";
case 6: return "陆";
case 7: return "柒";
case 8: return "捌";
case 9: return "玖";
default: return "";
}
}
// 判断一个字符串是否全0
bool judge_zero(string num){
bool zero = true;
for (int i = 0; i < num.length(); i++){
if (num[i] != '0'){
zero = false;
break;
}
}
return zero;
}
// 字符串转换为数字
int str_to_num(string str){
int num ;
stringstream ss;
ss << str;
ss >> num;
return num;
}
// 数字转换为字符串
string num_to_str(int num){
string str;
stringstream ss;
ss << num;
ss >> str;
return str;
}
// 分离出小数点前面部分
string get_pre(string input){
string pre = "";
int i = 0;
while (i < input.length() && input[i] != '.'){
pre += input[i];
i++;
}
return pre;
}
// 分离出小数点后面部分
string get_post(string input){
int i = 0;
string post = "";
while (i < input.length() && input[i] != '.'){
i++;
}
if (i < input.length()){
i++;
while (i < input.length()){
post += input[i];
i++;
}
}
return post;
}
// 四位及以下数字转换为大写
string get_four(int num){
string out = "";
if (num == 0)
out = "";
else if (num < 10){
out = get_c(num);
}
else if(num < 100){
if (num % 10 == 0)
out = get_four(num / 10) + "拾";
else
out = get_four(num / 10) + "拾" + get_four(num % 10);
}
else if(num < 1000){
if (num % 100 == 0)
out = get_four(num / 100) + "佰";
else if(num % 100 < 10)
out = get_four(num / 100) + "佰零" + get_four(num % 100);
else
out = get_four(num / 100) + "佰" + get_four(num % 100);
}
else if(num < 10000){
if (num % 1000 == 0)
out = get_four(num / 1000) + "仟";
else if(num % 1000 < 100)
out = get_four(num / 1000) + "仟零" + get_four(num % 1000);
else
out = get_four(num / 1000) + "仟" + get_four(num % 1000);
}
return out;
}
//八位数及以下数字转换为大写
string get_eight(string num){
while (num[0] == '0') // 删除开头的0
num = num.erase(0, 1);
if (num.length() <= 4)
return get_four(str_to_num(num));
string out;
string str1 = num.substr(0, num.length() - 4);
string str2 = num.erase(0, num.length() - 4);
int num1 = str_to_num(str1);
int num2 = str_to_num(str2);
if (str2[0] == '0' && !judge_zero(str2))
out = get_four(num1) + "万零" + get_four(num2);
else if (judge_zero(str2))
out = get_four(num1) + "万";
else
out = get_four(num1) + "万" + get_four(num2);
return out;
}
// 十六位数及以下数字转换为大写
string get_16(string num){
while (num[0] == '0') // 删除开头的0
num = num.erase(0, 1);
if (num.length() <= 8)
return get_eight(num);
string out;
string str1 = num.substr(0, num.length() - 8);
string str2 = num.erase(0, num.length() - 8);
if (str2[0] == '0' && !judge_zero(str2))
out = get_eight(str1) + "亿零" + get_eight(str2);
else if (judge_zero(str2))
out = get_eight(str1) + "亿";
else
out = get_eight(str1) + "亿" + get_eight(str2);
return out;
}
// 十六位数以上数字转换为大写,递归调用
string get_out_16(string num){
while (num[0] == '0') // 删除开头的0
num = num.erase(0, 1);
if (num.length() <= 16)
return get_16(num);
string out;
while (num.length() > 16){
string str1 = num.substr(0, num.length() - 8);
string str2 = num.erase(0, num.length() - 8);
if (str2[0] == '0' && !judge_zero(str2))
out = get_out_16(str1) + "亿零" + get_eight(str2);
else if (judge_zero(str2))
out = get_out_16(str1) + "亿";
else
out = get_out_16(str1) + "亿" + get_eight(str2);
}
return out;
}
// 整数部分转换为大写
string get_pre_c(string pre){
string out1 = "";
if (pre.length() <= 4){
int num = str_to_num(pre);
out1 = get_four(num);
}
else if (pre.length() <= 8)
out1 = get_eight(pre);
else if (pre.length() <= 16)
out1 = get_16(pre);
else
out1 = get_out_16(pre);
return out1;
}
// 小数部分转换为大写
string get_post_c(string post, int len){
string out2;
int num;
if (post.length() == 0)
out2 = "";
else if (post.length() == 1){
num = str_to_num(post);
if (num == 0)
out2 = "";
else
out2 = post + "角";
}
else{ // 字符串长度>=2,只取前两个
string two = post.substr(0, 2);
num = str_to_num(two);
if (num == 0){
out2 = "";
}
else if (num < 10 && len != 0)
out2 = "零" + get_c(num) + "分";
else if (num < 10 && len == 0) // 整数部分为0,分前面不需要0
out2 = get_c(num) + "分";
else{
int jiao = num / 10;
int fen = num % 10;
if (fen == 0)
out2 = get_c(jiao) + "角";
else
out2 = get_c(jiao) + "角" + get_c(fen) + "分";
}
}
return out2;
}
int main(){
string input;
cout << "请输入需要转换的金额(输入负数退出): ";
cin >> input;
while(!judge_isnum(input)){
cout << "不合法,请重新输入: ";
cin >> input;
}
while (input[0] != '-'){
while (input[0] == '0') // 删除开头的0
input = input.erase(0, 1);
string pre = get_pre(input);
string post = get_post(input);
string out1 = get_pre_c(pre);
string out2 = get_post_c(post, pre.length());
string output = "";
if (out1.length() == 0 && out2.length() == 0)
output = "人民币零元整";
else if(out1.length() == 0)
output = "人民币" + out2;
else if(out2.length() == 0)
output = "人民币" + out1 + "元整";
else
output = "人民币" + out1 + "元" + out2;
cout << "转换后大写为: " << output << endl;
cout << endl;
cout << "请输入需要转换的金额(输入负数退出): ";
cin >> input;
while(!judge_isnum(input)){
cout << "不合法,请重新输入: ";
cin >> input;
}
}
return 0;
}