蓝桥杯基础练习 数的读法

蓝桥杯基础练习 数的读法

整体思路是从前往后取亿、万前的四位数带入函数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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值