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