目录
题目
代码
#include <iostream>
#include <string.h>
using namespace std;
void yuzhi(int *n,int l)//对n预置
{
if(l%4==0&&l!=0)
*n=4;
if(l%4==1)
*n=1;
if(l%4==2)
*n=2;
if(l%4==3)
*n=3;
}
void f(int n)
{
if(n==4)
cout<<"qian ";
if(n==3)
cout<<"bai ";
if(n==2)
cout<<"shi ";
}
int main()
{
char a[10];
cin>>a;
int n=-1;
int length=strlen(a);
bool flag=true;
yuzhi(&n,length);
int j=0;
//============如果是全为0字符串,直接输出0===============
while(a[j]!='\0')
{
if(a[j]!='0')
flag=false;
j++;
}
if(flag)
{
cout<<"ling ";
return 0;
}
//============如果是全为0字符串,直接输出0===============
for(int i=0;i<10;i++)
{
switch(a[i])
{
case '0':if(a[i]=='0'&&a[i+1]!='0'&&n!=1)cout<<"ling ";break;
case '1':if(n!=2)cout<<"yi ";f(n);break;
case '2':cout<<"er ";f(n);break;
case '3':cout<<"san ";f(n);break;
case '4':cout<<"si ";f(n);break;
case '5':cout<<"wu ";f(n);break;
case '6':cout<<"liu ";f(n);break;
case '7':cout<<"qi ";f(n);break;
case '8':cout<<"ba ";f(n);break;
case '9':cout<<"jiu ";f(n);break;
default:break;
}
n--;
if(length-i-1==8)
{
n=4;
cout<<"yi ";
}
if(length-i-1==4)
{
n=4;
cout<<"wan ";
}
}
return 0;
}
思路
1.从高位开始读: 顺着i递增的顺序,,a[0]是输入数最高位,所以从高位开始处理
(输入逻辑:
存储逻辑:
2.区间标记n: 四位一个区间,( 数字范围2,000,000,000),被划分为20(亿) 0000(万)0000,这样每个区间内的读法都是一样的.n被我用来标记每个区间内的数位,n=4代表千位,相应用f(n)输出"qian",n=3代表百位,调用f(n)输出"bai",n=2代表十位,调用f(n)输出shi,每处理一个字符就使n减一
n的预置函数: yuzhi(n),用n对四取余来判定最高位在千位还是百位还是...
3.亿万什么时候输出?: 当检测到这是输入逻辑中第5位就输出"wan", i是存储逻辑中位序,length-i-1是输入逻辑的位序
1 2 3 4 5 6 7 0 0 9
i 0 1 2 3 4 5 6 7 8 9
length-i-1 9 8 7 6.............
4.连续0的处理: 首先连续0最多需要输出一个'0',甚至不需要输出0.
!100,1000: "yi bai wan yi qian" 而不是 "yi bai wan ling yi qian"
!101,1000:要输出101中的0
总之,如果某个区间内,有连续0,且连续到区间结束都没有非0字符,那么这些0都不需要输出,但是如果这个区间中,连续0后面存在非0元素,则输出0
case '0':if(a[i]=='0'&&a[i+1]!='0'&&n!=1)cout<<"ling ";break;
5. "十"和"一十"的分别:
“100000”读作“shi wan”而不是“yi shi wan”
"12"读作"shi er"不是"yi shi er"
总之,当1出现在区间中的第2位,即十位,都不读1,只读shi,比如110,读作"yi bai shi"
这个个人感觉和平时的语法习惯有点奇怪,是交了很多次之后推出来的,规则认定这样是对的
以下是dotcpp的代号wu大佬给的思路,写完上面才发现大佬给了总结
有关第7点:
对应第七点我原来写的代码是这样的:
if(length-i-1==8)
{
n=4;
if(a[i]==a[i-1]&&a[i]==0)continue;//没有这句也AC
cout<<"yi ";
}
if(length-i-1==4)
{
n=4;
if(a[i]==a[i-1]==a[i-2]==a[i-3]&&a[i]==0)continue;//没有这一句也AC
cout<<"wan ";
}
不考虑这点好像也是对的,可能没有对应的测试数据吧