Q:
在与财务相关的应用中,经常会用到人民币金额的大写,比如发票的打印程序。
本题的任务是:从键盘输入一个十亿以内的正整数(int类型),把它转换为人民币金额大写(不考虑用户输入错误的情况)。
比如,用户输入:35201,程序输出:叁万伍仟贰佰零壹
用户输入:30201,程序输出:叁万零贰佰零壹
用户输入:30001,程序输出:叁万零壹
用户输入:31000,程序输出:叁万壹仟
用户输入:120023201,程序输出:壹亿贰仟零贰万叁仟贰佰零壹
用户输入:120020001,程序输出:壹亿贰仟零贰万零壹
用户输入:100000001,程序输出:壹亿零壹
可以看到,在万后满千位,则不加零,否则要补零,但不要出现类似“零零”的情况。
在亿后满千万位,则不加零,否则要补零,但整个“万档”没有数字时,“万”字省去。
A:
>>判断不难,直接暴破,就是中文的赋值和输出费了点劲
>>初始化时用char[2]和char[3]会报错,必须要char[4],赋值用strncpy(str1, str2, 2)却只用了2,现在也没搞清楚
#include "stdio.h"
#include "windows.h"
int main (void)
{
int i, n, digit, flag;
char big[2][4]={"万","亿"}, sma[4][4]={"仟","0","拾","佰"},deci[10][4]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//零、壹、贰、叁、肆、伍、陆、柒、捌、玖 拾、佰、仟、万、亿
char output[40][4], origin[11]="0";
while(scanf("%s",origin)){
n=flag=0;
int len=strlen(origin);
for(i=0; i<len; i++){
digit=(i+1)%4;
if(digit==1){
if(origin[len-1-i]-'0'==0 && origin[len-2-i]-'0'==0 && origin[len-3-i]-'0'==0 && origin[len-4-i]-'0'==0){
i+=3;
continue;
}
else{
if(i/4 >= 1){
strncpy(output[n],big[(i/4)-1],2);
output[n][2]='\0';
n++;
}
}
if(origin[len-1-i]-'0'==0){
flag=1;
continue;
}
else{
strncpy(output[n],deci[origin[len-1-i]-'0'],2);
output[n][2]='\0';
n++;
flag=0;
}
}
else{
if(origin[len-1-i]-'0'==0){
if(!flag){
strncpy(output[n],deci[0],2);
output[n][2]='\0';
n++;
flag=1;
}
else
continue;
}
else{
strncpy(output[n],sma[digit],2);
output[n][2]='\0';
n++;
strncpy(output[n],deci[origin[len-1-i]-'0'],2);
output[n][2]='\0';
n++;
flag=0;
}
}
}
for(i=n-1; i>=0; i--)
printf("%s",output[i]);
puts("");
}
system("pause");
return (0);
}