蓝桥杯基础练习 数的读法
整体思路是从前往后取亿、万前的四位数带入函数F得到读法,每读四位后添加按情况添加“亿”“万”:
如
1、12340000
2、1234
1的前四位读为 “一千二百三十四万” 去掉“万”则和2的读法无区别。
有了这个整体思路再一点点改bug
要注意 100000 为“十万”,100000101读“一亿零一百零一”(读后四位0101函数已经添加了“零”),100001010读“一亿零一千零一十”(读后四位1010函数F不会去添加“零一千零一十”中第一个零,所以在函数外进行了判断),注意如何读“零”。
代码:
如有误欢迎指出!
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
string a[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu","shi"};
map<int,string>mp;
//300007 san shi wan ling qi
//2000 er qian
//10010 yi wan ling yi shi
//100000 shi wan
//1234567009 shi er yi san qian si bai wu shi liu wan qi qian ling jiu
//100001000 yi yi ling yi qian
int k;
string s;
void F(int n)//n:输入四位数 k: 1:前已读数、0:前无读数
{
int kk=0;
if(n==0) return;
if(n/1000==0&&k==1)//10010
{
s+=" ling";
}
int x=1000;
while(x)
{
if(n/x!=0)//1000/1000
{
kk=1;
if(k==0)
{
k=1;
if(n>=10&&n<=19)//10 shi
{
s=s+"shi";
}
else
{
s=s+mp[n/x];
if(x!=1)
s=s+" "+mp[x];
}
}
else
{
s=s+" "+mp[n/x];
if(x!=1)
s=s+" "+mp[x];
}
}
else if(kk==1&&n%x!=0)//n/x==0 前边有数,后边有数 如 1001 这里当x=1时不满足条件 此时x/10!=0 排除了除0的情况
{
if(n/(x/10)!=0)//后紧跟的一位有数 1010 1001
s=s+" ling";
}
n=n%x;
x=x/10;
}
}
int main()
{
int n;
for(int i=0;i<=10;i++)
{
mp[i]=a[i];
}
mp[100]="bai";
mp[1000]="qian";
mp[10000]="wan";
mp[100000000]="yi";
cin>>n;
int x=100000000;
while(x>0)
{
if(n>=x)
{
F(n/x);
}
if(k==1)
{
if(x==100000000)
{
s=s+" yi";
}
if(x==10000&&n/x!=0)
{
s=s+" wan";
}
if(x==10000&&n/x==0&&n%x>=1000)//100000001
{
s=s+" ling";
}
}
n=n%x;
x=x/10000;
}
cout<<s;
return 0;
}