[蓝桥]基础vip_数的读法

目录

题目

代码

思路


 

 

 

 


题目

代码

#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 ";
        }

不考虑这点好像也是对的,可能没有对应的测试数据吧

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值