报数( Read . pas / c / cpp )

时间:2023-01-01 04:01:58
 报数( Read . pas / c / cpp )

【 题目描述 】

CG 同学又弄到一批新牛,新牛到了农场以后,首先要学习汉语,数的朗读成为新牛的一个难题,朗读绝对值小于10亿的数。

新牛们知道汉语中有如下的读数规则:

1、首先读符号位,然后读整数部分,整数部分之后可能出现小数点,如果有小数部分则小数点一定出现、并且读出小数点之后读小数部分。

2、符号位的读法是:

(1)正数,不论正号“+”是否出现,都不必读出符号位;

(2)负数的最左边的符号是“-” ,读成“负”(以“ F”来表示“负”)。

3、整数部分的读法是:

(1)如果整数部分不存在或者整数部分全是零则直接读成“零”(以“0”来表示“零”);

(2)否则从整数部分中最左边的非零数字开始读起,然后以十、百、千、万、亿(分别以“S”、“B”、“Q”、“W”、“Y”来表示)等数量单位来拼读整数部分。

4、整数部分中:

(1)每一个非零数字都必须结合各个相应的数量单位读出来;

(2)每一段连续的“零”只能读成一个“零”,但是某一段连续的“零”的左侧或者右侧不存在非零数字(这里只考虑整数部分)则这一段“零”不应该读出来;

5、如果有小数部分,则首先读“点”(以“D”来表示“点”),然后从左至右有顺序地读出各个小数位。在读小数部分的时候不可以使用十、百、千、万、亿等数量单位;但是小数部分的每一个数字都需要读出来,连续的零不可以读成一个“零”,而应该分别读出。

6、如果数中有小数点而没有小数部分,则不应该把小数点读出来。

例如:-0020030004.567 应该读成 " F2Q03W04D567 " , 000.89 应该读成“0D89 ”。请你编写程序帮助新牛把给定的数正确地读出来。

【输入数据】

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

【输出数据】

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

【样例输入】

-0020030004.567

【 样例输出 】

F2Q03W04D567

===============================

=======================

const
  d:array[0..8]of string=('','S','B','Q','W','S','B','Q','Y');
var
  i:longint;
  st:string;
  st1:string;
procedure init;
begin
  assign(input,'read.in');
  assign(output,'read.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure work1;
var
  j:longint;
begin
  inc(i);
  j:=length(st);
  while (st[j]='0')and(j>=i) do dec(j);
  if i=j+1 then
    begin
      writeln('0');
      terminate;              //-0.000000的情况.. 注意讨论...
    end;                      //0.0000000的情况..
  writeln(st1,'0D',copy(st,i,j-i+1));
end;

procedure work3(s:string);
var
  t:longint;
  flag:boolean;
begin
  t:=length(s);
  flag:=true;
  for i:=1 to t do
    begin
      if s[i]<>'0' then begin write(s[i],d[t-i]); flag:=true end
      else if (s[i]='0')and(flag) then begin write('0'); flag:=false; end;
    end;
end;
procedure work2;
var
  j,k:longint;
  t:longint;
begin
  write(st1);
  st:=copy(st,i,length(st)-i+1);
  t:=length(st);
  j:=1;
  while (j<=t)and(st[j]<>'.') do inc(j);  //找到'.'的位置..
  
  if j>=t then
    begin
      work3(copy(st,1,j-1));
    end //整数..(可能有.可能没有)
    else
    begin
      k:=t;
      while (k>j)and(st[k]='0') do dec(k);
      work3(copy(st,1,j-1));
      if k>j then
        begin
          write('D');
          writeln(copy(st,j+1,k-j));
        end;
    end;//有小数部分..
end;

procedure main;
var
  t:longint;
begin
  readln(st);
  st1:='';
  if st[1]='-' then
    begin
      st1:=st1+'F';
      st:=copy(st,2,length(st)-1);
    end;
  if st[1]='+' then
    begin
      st:=copy(st,2,length(st)-1);
    end;
  i:=1;     t:=length(st);
  while (st[i]='0')and(i<=t) do inc(i);
  if i=length(st)+1 then begin writeln(0); terminate; end;
  if st[i]='.' then work1  //0.几几几的情况
               else work2; //几.几几几的情况..
end;

begin
  init;
  main;
  terminate;
end.