• 解题报告 报数


     

    1.        题目

    报数(Read.pas/c/cpp)

    题目描述

     新兵到了队伍以后,首先要学习报数,数的朗读成为新兵的一个难题,朗读绝对值小于10亿的数。
       新兵们知道汉语中有如下的读数规则:
    1)首先读符号位,然后读整数部分,整数部分之后可能出现小数点,如果有小数部分则小数点一定出现、并且读出小数点之后读小数部分;
    2)符号位的读法是:
      
    2.1)正数,不论正号"+"是否出现,都不必读出符号位;
      
    2.2)负数的最左边的符号是"-",读成""(以"F"来表示"");
    3)整数部分的读法是:
      
    3.1)如果整数部分不存在或者整数部分全是零则直接读成""(以"0"来表示""
      
    3.2)否则从整数部分中最左边的非零数字开始读起,然后以十、百、千、万、亿(分别以"S""B""Q""W""Y"来表示)等数量单位来拼读整数部分;
    4)整数部分中:
      
    4.1)每一个非零数字都必须结合各个相应的数量单位读出来;
      
    4.2)每一段连续的""只能读成一个"",但是某一段连续的""的左侧或者右侧不存在非零数字(这里只考虑整数部分)则这一段""不应该读出来;
    5)如果有小数部分,则首先读""(以"D"来表示""),然后从左至右顺序地读出各个小数位。在读小数部分的时候不可以使用十、百、千、万、亿等数量单位;但是小数部分的每一个数字都需要读出来,连续的零不可以读成一个"",而应该分别读出;
    6)如果数中有小数点而没有小数部分,则不应该把小数点读出来。
       例如,-0020030004.567应该读成"F2Q03W04D567"000.89应该读成"0D89"
       请你编写程序帮助新兵把给定的数正确的读出来。

     

    输入数据

    输入文件仅一行,存放了一个数(不超过50个字符),其绝对值小于10亿。

    输出数据

    输出文件仅一行,输出这个数的正确读法。

     

    样例输入

    -0020030004.567

    样例输出

         F2Q03W04D567

    2.        题目实质

    模拟,没有最变态,只有更变态,XD

    将一个数按指定形式输出。

    3.        算法

    模拟。

    4.        注意事项

    首先,每个数前面的 0 可以直接用 double 处理:读入一个 double ,或是读入一个字符串,再转换为 double

    注意小数部分的处理:浮点误差很可恶,最可靠的方法是,读入一个串,再转换成一个 double ,然后处理完整数部分后,将这个串小数点以前的部分删除,直接将这个串输出。

    5.        程序代码

    SueMiller pascal

    var nn:double;

        flag:boolean;

        n:longint;

        s:string;

        code,p,l,i:integer;

        t:string;

    begin

      assign(input,'Read.in');reset(input);

      assign(output,'Read.out');rewrite(output);

      readln(t);

      val(t,nn);

      if nn<0 then write('F');

      nn:=abs(nn);

      if nn<1 then write('0');

      flag:=false;

      n:=trunc(nn);

      if n>=100000000 then begin write(n div 100000000,'Y');n:=n-n div 100000000*100000000;flag:=true;end;

      if n>=10000000 then begin write(n div 10000000,'Q');n:=n-n div 10000000*10000000;flag:=true;end

      else if flag then begin write('0');flag:=false;end;

      if n>=1000000 then begin write(n div 1000000,'B');n:=n-n div 1000000*1000000;flag:=true;end

      else if flag then begin write('0');flag:=false;end;

      if n>=100000 then begin write(n div 100000,'S');n:=n-n div 100000*100000;flag:=true;end

      else if flag then begin write('0');flag:=false;end;

      if n>=10000 then begin write(n div 10000,'W');n:=n-n div 10000*10000;flag:=true;end

      else if flag then begin write('0');flag:=false;end;

      if n>=1000 then begin write(n div 1000,'Q');n:=n-n div 1000*1000;flag:=true;end

      else if flag then begin write('0');flag:=false;end;

      if n>=100 then begin write(n div 100,'B');n:=n-n div 100*100;flag:=true;end

      else if flag then begin write('0');flag:=false;end;

      if n>=10 then begin write(n div 10,'S');n:=n-n div 10*10;end

      else if flag then begin write('0');flag:=false;end;

      if n>=1 then begin write(n);end;

      nn:=nn-trunc(nn);

      if nn>0 then

        begin

          write('D');

          l:=length(t);

          for i:=1 to l do

            if (t[i]='.') then break;

          delete(t,1,i);

          write(t);

        end;

      writeln;

      close(input);close(output);

    end.

     

  • 相关阅读:
    11二分查找算法
    09Python之迭代器,生成器
    12递归函数
    Git 常用操作
    10Python之内置函数
    06python之函数进阶
    ZendStudio自定义代码补全,自定义代码段
    07python之装饰器
    Vue组件库文档站点的搭建思路
    Markdown文件居然也可以直接作为Vue路由组件?
  • 原文地址:https://www.cnblogs.com/SueMiller/p/2129908.html
Copyright © 2020-2023  润新知