【 题目描述 】
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.