思路分享

人民币转换

http://www.nowcoder.com/questionTerminal/00ffd656b9604d1998e966d555005a4b

做了十几道题唯一一次弄出排行第一的答案,得炫耀一下
思路很简单

  1. 每一位只要数字不为0|1其单位必须输出
  2. 1000000为例,将之看作10 0000. 0000共10位(序号为0-9位),从第0位开始处理:
    • 0位和第1位单位为空'',值恒为0,其余单位见代码units数组。
    • 若位置position40则此处单位必须输出(代码中的position值实际上相当于本文中position-2),此处的0必不输出,因此元、万位不输出0但必须输出单位;
    • 当前位置的前一位置出现过0,则当前的0不输出,因此拾、佰、仟位不输出0。
    • 若位置position41说明是位,则此处若为1不输出。
  3. 位低的位即使满足输出的条件也不输出。
  4. 若当前处理到的位置单位为,但组装出的字符串仍为空,则先在字符串中装入
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct CH Ch;
struct CH
{
    char ch[4];
    Ch *next;
    /* data */
};
int main()
{
    char number[10][4] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    char unit[11][4] = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};
    // char unit[13][4] = {"","","分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"};
    char integer[4] = "整";
    long long num = 0;
    double value;
    int position;
    int zero = 0;
    int posnum = 0;
    Ch *ptr = 0;
    Ch *header = 0;
    while (scanf("%lf", &value) != EOF)
    {
        position = 0;
        // position = 2;
        // 不加会变成0.28
        num = (value + 0.0001) * 100;
        zero = 0x02;
        while (num)
        {
            // 上一个非0,当前不是起始位,方可输出0
            // 不是十位方可输出1
            // 当前是起始位,或当前位不为0方可输出单位
            if (!header && position > 1)
            {
                ptr = (Ch *)malloc(sizeof(Ch));
                ptr->next = header;
                header = ptr;
                strcpy(ptr->ch, "整");
            }
            posnum = num % 10;
            if ((0x01 & zero) || posnum)
            {
                ptr = (Ch *)malloc(sizeof(Ch));
                ptr->next = header;
                header = ptr;
                strcpy(ptr->ch, unit[position]);
            }
            if (posnum == 0)
            {
                if (!zero && position > 1)
                {
                    ptr = (Ch *)malloc(sizeof(Ch));
                    ptr->next = header;
                    header = ptr;
                    strcpy(ptr->ch, number[posnum]);
                }
            }
            else if (posnum == 1)
            {
                if (position != 3 && position != 7)
                {
                    ptr = (Ch *)malloc(sizeof(Ch));
                    ptr->next = header;
                    header = ptr;
                    strcpy(ptr->ch, number[posnum]);
                }
            }
            else
            {
                ptr = (Ch *)malloc(sizeof(Ch));
                ptr->next = header;
                header = ptr;
                strcpy(ptr->ch, number[posnum]);
            }
            num /= 10;
            position++;
            if (posnum)
            {
                zero &= 0xfd;
            }
            else
            {
                zero |= 0x02;
            }
            if ((position + 2) % 4 == 0)
            {
                zero |= 0x01;
            }
            else
            {
                zero &= 0xfe;
            }
        }
        printf("人民币");
        while (header)
        {
            ptr = header->next;
            printf("%s", header->ch);
            free(header);
            header = ptr;
        }
        printf("\n");
    }
    return 0;
}
全部评论
输入:100001000 输出:人民币壹亿万壹仟元整
2 回复 分享
发布于 2022-02-19 14:49
老铁,你这个代码调了多久?
点赞 回复 分享
发布于 2022-08-22 14:44 陕西

相关推荐

05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
昨天 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务