【2016.10.7NOIP普及模拟】幂运算
2016-10-07 13:57
399 查看
题目描述
星期五下午,放学的下课铃声响了,周末到了,同学们非常高兴。但今天小Y高兴不起来,因为老师布置了一道比较烦的幂运算题。一般情况下,计算机所能够处理的小数的范围和精度都是非常有限的。小Y的老师给出了一个小数a和指数b,让小Y求ab。小Y觉得手算非常麻烦,于是很不高兴,希望你能编程帮助他计算。
输入
输入文件exp.in仅包含两行。第一行是a。
第二行是b。
a>0,a的长度不超过10位(不包括小数点),保证这个数是X.Y的形式,其中X一定存在,但Y可能没有(此时小数点也不会有)。a可能有多余的前导零或尾零。
1 <= b <= 25,且为整数。
输出
输出文件exp.out仅包含一行,即ab的结果。整数部分前面有0必须去掉,小数部分末尾有0也必须去掉。例如000.10100需要变为.101(整数部分为0也去掉)。如果结果是整数则直接输出整数形式即可。
思路
普通的高精度乘法const maxn=1000; var a:array[1..maxn] of int64; i,j,k,n,m,l,p:longint; st:string; procedure init; begin readln(st); readln(m); l:=length(st); while st[l]='0' do dec(l); delete(st,l+1,length(st)-l); for i:=1 to l do if st[i]='.' then begin p:=l-i; dec(l); 4000 delete(st,i,1); break end; j:=1; while (st[j]='0') and (j<i-1) do begin dec(l); inc(j) end; delete(st,1,length(st)-l); for i:=l downto 1 do a[maxn-l+i]:=ord(st[i])-ord('0'); val(st,n); end; procedure mul; var i:longint; s,g:int64; begin g:=0; for i:=maxn downto 1 do begin s:=a[i]*n+g; a[i]:=s mod 10; g:=s div 10 end; end; procedure print; begin i:=1; p:=p*m; while (a[i]=0) and (i<maxn-p+1) do inc(i); k:=maxn; while a[k]=0 do dec(k); for j:=i to k do if j=maxn-p+1 then write('.',a[j]) else write(a[j]) end; begin assign(input,'exp.in'); reset(input); assign(output,'exp.out'); rewrite(output); init; for i:=1 to m-1 do mul; print; end.
相关文章推荐
- 【2016.10.7NOIP普及模拟】找试场
- 【2016.10.7NOIP普及模拟】圆的国度
- 【2016.10.7NOIP普及模拟】箱子嵌套
- 2016.08.19 初中部 NOIP普及组 模拟赛
- 【模拟】[NOIP2011普及组]统计单词数
- 2016.08.19上午【初中部 NOIP普及组 】模拟赛题解
- 2016.08.19上午【初中部 NOIP普及组 】模拟赛题解
- 【NOIP普及组模拟】DNA排序
- JZOJ__Day 2:【NOIP普及模拟】和谐数
- 2063. 【2016.10.4NOIP普及模拟】Exam
- 【2016.10.6NOIP普及模拟】Queen
- noip1996 乘法运算 - 普及组 (模拟)
- 【NOIP普及组】2016模拟考试(10.29)——摆花
- NOIP2011-普及组复赛模拟试题-第一题-NBA总冠军
- NOIP2010-普及组复赛模拟试题-第一题-手机
- 2016.08.18【初中部 NOIP普及组 】模拟赛题解
- 【模拟 集合】[NOIP2008普及组]立体图 tyvj1009
- 2016.08.19上午【初中部 NOIP普及组 】模拟赛
- JZOJ__Day 2:【NOIP普及模拟】分数
- JZOJ__Day 1:【NOIP普及模拟】JABUKE