讨论 / 大牛请赐教!
zjlsykw3636 2008-06-14 20:46:00
点我顶贴 收藏 删除
..答案已经出来了

但是..............怎么全部输出有效数字?

我用while做乘法原理输出的测试数据是:

0.0247500000000000008881784197

(= =|||

why?why?WHY?!!!

但是直接输出又是对的..

直接输出:2.475000000000000E-002

#1 zjlsykw3636@2008-06-14 00:29:00
回复 删除
我只是想问下大家怎么把

那一大串输出变成

0.02745

#2 xiaokeke@2008-06-14 20:44:00
回复 删除
我用的是高精度乘法 没有把x% 转换成小数

最后找零 加小数点 就行了

我不会用小数做 - -!

#3 fjxmlhx@2008-06-14 20:46:00
回复 删除
var

code:word;

b,c,sz:array[0..1000] of longint;

jl,s,tmp:string;

a:array[1..4] of string[10];

sum,n,i,j,q,k,js:longint;

procedure main;

begin

readln(n);

sz[1]:=1;

sz[0]:=1;

readln(s);

for i:=1 to n do

begin

fillchar(b,sizeof(b),0);

fillchar(c,sizeof(c),0);

readln(tmp);

for j:=1 to 3 do

begin

k:=pos( ,tmp);

a[j]:=copy(tmp,1,k-2);

delete(tmp,1,k);

end;

K:=pos(%,tmp);

a[4]:=copy(tmp,1,k-1);

if s[i]=A then sum:=1

else if s[i]=B then sum:=2

else if s[i]=C then sum:=3

else if s[i]=D then sum:=4;

js:=0;

for j:=length(a[sum]) downto 1 do

begin

js:=js+1;

val(copy(a[sum],j,1),b[js],code);

end;

for q:=1 to sz[0] do

for j:=1 to length(a[sum]) do

begin

c[q+j-1]:=c[q+j-1]+sz[q]*b[j];

c[q+j]:=c[q+j]+c[q+j-1] div 10;

c[q+j-1]:=c[q+j-1] mod 10;

end;

if c[sz[0]+length(a[sum])]<>0 then sz[0]:=sz[0]+length(a[sum]) else sz[0]:=sz[0]+length(a[sum])-1;

for j:=1 to sz[0] do sz[j]:=c[j];

end;

js:=0;

jl:=;

s:=;

end;

begin

main;

for i:=sz[0] downto 1 do begin str(sz[i],jl);s:=s+jl;end;

js:=n shl 1;

if js=length(s) then s:=0.+s

else if js>length(s) then

begin

sum:=0;

repeat

inc(sum);if sum>length(s) then s:=0+s;

if sum=js then begin s:=0.+s;break;end;

until 1+1=3;

while true do

begin

if (s[length(s)]=0)then delete(s,length(s),1) else

if s[length(s)]=. then begin delete(s,length(s),1);break;end

else break;

end;

end

else

begin

sum:=0;

for i:=length(s) downto 1 do

begin

sum:=sum+1;

if sum=js then begin insert(.,s,i);break;end;

end;

while true do

begin

if (s[length(s)]=0)then delete(s,length(s),1) else

if s[length(s)]=. then begin delete(s,length(s),1);break;end

else break;

end;

end;

write(s);

end.

这个算法..看得懂都不容易

#4 fjxmlhx@2008-06-14 20:46:00
回复 删除
var

code:word;

b,c,sz:array[0..1000] of longint;

jl,s,tmp:string;

a:array[1..4] of string[10];

sum,n,i,j,q,k,js:longint;

procedure main;

begin

readln(n);

sz[1]:=1;

sz[0]:=1;

readln(s);

for i:=1 to n do

begin

fillchar(b,sizeof(b),0);

fillchar(c,sizeof(c),0);

readln(tmp);

for j:=1 to 3 do

begin

k:=pos( ,tmp);

a[j]:=copy(tmp,1,k-2);

delete(tmp,1,k);

end;

K:=pos(%,tmp);

a[4]:=copy(tmp,1,k-1);

if s[i]=A then sum:=1

else if s[i]=B then sum:=2

else if s[i]=C then sum:=3

else if s[i]=D then sum:=4;

js:=0;

for j:=length(a[sum]) downto 1 do

begin

js:=js+1;

val(copy(a[sum],j,1),b[js],code);

end;

for q:=1 to sz[0] do

for j:=1 to length(a[sum]) do

begin

c[q+j-1]:=c[q+j-1]+sz[q]*b[j];

c[q+j]:=c[q+j]+c[q+j-1] div 10;

c[q+j-1]:=c[q+j-1] mod 10;

end;

if c[sz[0]+length(a[sum])]<>0 then sz[0]:=sz[0]+length(a[sum]) else sz[0]:=sz[0]+length(a[sum])-1;

for j:=1 to sz[0] do sz[j]:=c[j];

end;

js:=0;

jl:=;

s:=;

end;

begin

main;

for i:=sz[0] downto 1 do begin str(sz[i],jl);s:=s+jl;end;

js:=n shl 1;

if js=length(s) then s:=0.+s

else if js>length(s) then

begin

sum:=0;

repeat

inc(sum);if sum>length(s) then s:=0+s;

if sum=js then begin s:=0.+s;break;end;

until 1+1=3;

while true do

begin

if (s[length(s)]=0)then delete(s,length(s),1) else

if s[length(s)]=. then begin delete(s,length(s),1);break;end

else break;

end;

end

else

begin

sum:=0;

for i:=length(s) downto 1 do

begin

sum:=sum+1;

if sum=js then begin insert(.,s,i);break;end;

end;

while true do

begin

if (s[length(s)]=0)then delete(s,length(s),1) else

if s[length(s)]=. then begin delete(s,length(s),1);break;end

else break;

end;

end;

write(s);

end.

这个算法..看得懂都不容易

查看更多回复
提交回复