给定一个数值,输出符合中国人习惯的读法--记一道笔试题

题目:给定一个数字,最大小于一万亿,输出符合中国人习惯的读法,例如:

a、12输出:十二

b、102输出:一百零二

c、1002输出:一千零二

d、112输出:一百十二

e、10112输出:一万零一百十二

f、120000000:一亿二千万

g、11021002:一千一百零二万一千零二

h、11020102:一千一百零二万零一百零二

i、1000001:一百万零一

j、1000000001:十亿零一

  嗯,一道笔试题,解的很没有节操,没有太好的思路,只能尽力抽取翻译过程中的共有代码,尽量写的不那么难看。

  基本思路就是把输入的数补全为12位,然后三等分,分别转换计算,然后拼接起来。

  PS:感觉中文语言坑比较多,越写越丑。

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4
  5 //判断该位置后是否还有非零数
  6 bool NoPosAfter(std::string str, int index)
  7 {
  8     int len = str.size();
  9     for(int i = index+1; i < len; ++i)
 10     {
 11         if(str[i] != ‘0‘)return false;
 12     }
 13     return true;
 14 }
 15
 16 std::string convert(std::string str)
 17 {
 18     std::vector<std::string> unit{"", "十", "百", "千"};
 19     std::vector<std::string> num{"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
 20
 21     std::string ret("");
 22
 23     int i = 0;
 24     while(i < 4 && str[i] == ‘0‘) ++i;
 25     if(i == 4) return ret;
 26     while(i < 4)
 27     {
 28         if(str[i] == ‘0‘)
 29         {
 30             if(NoPosAfter(str, i))
 31             {
 32                 return ret;
 33             }
 34             else
 35             {
 36                 if(i > 0)
 37                     if(str[i-1] != ‘0‘)
 38                         ret += "零";
 39             }
 40         }
 41         else
 42         {
 43             ret += num[str[i]-‘0‘] + unit[3-i];
 44         }
 45         ++i;
 46     }
 47
 48     return ret;
 49 }
 50
 51 void print(std::string input)
 52 {
 53     std::string cstr(12, ‘0‘);
 54     cstr.replace(12-input.size(), input.size(), input);
 55
 56     std::string Ystr(cstr, 0, 4);
 57     std::string Wstr(cstr, 4, 4);
 58     std::string Lstr(cstr, 8, 4);
 59
 60     std::string result;
 61
 62     auto Yret = convert(Ystr);
 63     auto Wret = convert(Wstr);
 64     auto Lret = convert(Lstr);
 65
 66     bool high = false;//高位标志
 67     if(Yret.size() != 0)
 68     {
 69         result += Yret + "亿";
 70         high = true;
 71     }
 72
 73     if(Wret.size() != 0)
 74     {
 75         if(Wstr < "1000" && high) result += "零";
 76         result += Wret + "万";
 77         high = true;
 78     }
 79     else if(Lret.size() != 0)
 80     {
 81         if(high)result += "零";
 82     }
 83
 84     if(Lret.size() != 0)
 85     {
 86         if(Lstr < "1000" && high && Wret.size()) result += "零";
 87         result += Lret;
 88     }
 89
 90     if(result.find("一十") == 0)
 91     {
 92         result.erase(0, 2);
 93     }
 94
 95     std::cout << result << std::endl;
 96 }
 97
 98 int main()
 99 {
100     print("112");
101     print("10112");
102     print("120000000");
103     print("11021002");
104     print("11020102");
105     print("1000001");
106
107     return 0;
108 }

时间: 2024-07-30 13:46:18

给定一个数值,输出符合中国人习惯的读法--记一道笔试题的相关文章

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

一道笔试题-给定一个正整数序列,请尝试将它们重新排列使得排列的结果最大。

问题描述:给定一个正整数序列,请尝试将它们重新排列使得排列的结果最大,例如正整数序列为9,31,35,3,7则最大值为9735331. 思路分析:先将正整数序列转换为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可.根据题目的要求,两个数字m和n排成的数字mn和nm,如果mn<nm,那么我们应该输出nm,也就是m应该排在n的后面,也就是m<n.反之,如果nm<mn,m排在n的前面,n<m.如果mn==mn,m等于n. 比较函数的定义是本解决方案的关键.这道题其实就是希

记一道面试题:手写一个内存泄漏的代码,如何修正

前几天面试的时候被问到手写一个内存泄漏的代码,并且如何修正,当时有点蒙,后来面试官写了三行代码,如下 1 Object obj1=new Object(); 2 Object obj2=new Object(); 3 obj1=obj2; 试分析是否出现内存泄漏,为什么, 首先,先了解一下内存泄漏是什么?百度百科给了一个答案 简单的说就是我们已经不需要的对象,它没有被清理,依旧存在堆内存中.但是项目一旦运行又不会时长终止,那么这个对象就会一直存在,占用空间也会进行累计. 上面的代码是存在内存泄漏

输入一个数值,输出其是否质数,1是质数,0不是质数

输入一个数值,输出其是否质数,1是质数,0不是质数. 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 int sushu(int num)//1是质数,0不是质数 6 { 7 int i; 8 int flag = 1;//默认是质数 9 10 if (num <= 1)//负数,0,1不是质数 11 { 12 flag = 0; 13 } 14 else 15 { 16 for (i = 2;i < num;

给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-1。

1. 给定一个字符串,找到第一个只出现一次的字符的下标,找不到输出-1. sample: 输入:"abcdefcba" 输出:3 解法:先遍历字符串,用一个map记录每个字符出现的次数,再次遍历字符串,找到第一个只出现一次的字符,复杂度为O(n). #include <iostream> #include <string> #include <cstring> #include <map> using namespace std; int

c语言:给定一个大写字母,用小写字母输出

给定一个大写字母,用小写字母输出 程序: #include<stdio.h> int main() { char   c1,c2; printf("请输入一个大写字母:"); scanf("%c", &c1); c2=c1+32; printf("c2=%c\nc2=%d\n", c2,c2); return 0; } 结果: 请输入一个大写字母:A c2=a c2=97 请按任意键继续. . .

给定一个字符串类型表示的小数,输出其二进制表示

题目 给定一个字符串类型(string)表示的小数,打印出它的二进制表示. 如果这个数无法精确地表示为二进制形式,输出”ERROR”. 解答 整数部分通过不断地对2取余然后除以2来得到其二进制表示, 或是不断地和1按位与然后除以2得到其二进制表示. 小数部分则通过不断地乘以2然后与1比较来得到其二进制表示. 小数部分转化为二进制,通过乘以2然后与1比较,大于等于1则该位为1,并且该值减去1: 否则该位为0.不断地通过这种操作最终能使该小数部分的值变为0的,即可精确表示. 否则将无法用有限的位数来

给定一个 hashMap 最终输出最大值的键

1 /** 2 * 3 * 类 描 述:机试题: 给定一个 hashMap 最终输出最大值的键 4 * 作 者: 赵 鹏 5 * 时 间:2017年7月4日 下午6:51:06 6 */ 7 8 public class Test { 9 10 public static void main(String[] args) { 11 12 Map<Integer, Integer> hashMap = new HashMap<Integer , Integer>(); 13 14 /

给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。

问题描述:给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果.输入值小于1000.如,输入为10,程序应该输出结果为2.(共有两对质数的和为10,分别为(5,5),(3,7)) 附算法代码: public class PrimeNumber { //判断是否是质数 protected boolean isPrimeNumber(int num){ if(num == 2) return true;//2特殊处理 if(num < 2 || num % 2 == 0) r