POJ 1001 求高精度幂(高精度)
2015-10-09 19:33
176 查看
Description
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。现在要你解决的问题是:对一个实数R,要求写程序精确计算R的n次方R^n,其中n 是整数并且0.0 < R < 99.999,0< n<=25
Input
T输入包括多组R和n。R的值占第 1 到第 6 列,n的值占第8和第9列
Output
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
Sample Input
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
Solution
高精度乘法,注意前置零和后置零以及整数时去掉小数点,其中有一个显然的结论,小数点原来位置是pos,那么结果小数点的位置应为pos*n
Code
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。现在要你解决的问题是:对一个实数R,要求写程序精确计算R的n次方R^n,其中n 是整数并且0.0 < R < 99.999,0< n<=25
Input
T输入包括多组R和n。R的值占第 1 到第 6 列,n的值占第8和第9列
Output
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
Sample Input
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
Solution
高精度乘法,注意前置零和后置零以及整数时去掉小数点,其中有一个显然的结论,小数点原来位置是pos,那么结果小数点的位置应为pos*n
Code
#include<stdio.h> #include<string.h> int a[1111111],b[1111111],temp[1111111],la,lb; void multi() { memset(temp,0,sizeof(temp)); for(int i=0;i<la;i++) for(int j=0;j<lb;j++) { temp[i+j]+=a[i]*b[j]; if(temp[i+j]>9) { temp[i+j+1]+=temp[i+j]/10; temp[i+j]%=10; } } if(temp[la+lb-2]>9)//进位 { temp[la+lb-1]+=temp[la+lb-2]/10; temp[la+lb-2]%=10; } la=la+lb; for(int i=0;i<la;i++) a[i]=temp[i]; } int main() { char s[10]; int n; while(~scanf("%s%d",s,&n)) { int pos=-1;//小数点位置 for(int i=5,j=0;i>=0;i--) if(s[i]!='.') a[j]=s[i]-'0',b[j]=a[j],j++; else pos=i; la=lb=(pos==-1?6:5); for(int i=1;i<n;i++) multi(); if(pos==-1)//没有小数点直接输出结果即可 { for(int i=la-1;i>=0;i--) printf("%d",a[i]); printf("\n"); } else//有小数点 { int l,r; pos=5-pos; pos*=n;//结果中小数点位置 for(int i=0;i<la;i++)//后置零 if(a[i]!=0) { l=i; break; } for(int i=la-1;i>=0;i--)//前置零 if(a[i]!=0) { r=i; break; } if(r<pos)r=pos-1; if(l>pos)l=pos; for(int i=r;i>=l;i--) { if(i==pos-1)printf("."); printf("%d",a[i]); } printf("\n"); } } return 0; }
相关文章推荐
- TestDataBuilder自动生成工具
- 单链表反向查找
- __attribute((aligned(n)))与#pragma pack (n)详解
- 我的保研经历与心得(武大软院-->中科院软件所 / 浙大计院CAD&CG)
- 计算机 字节、位等之间的换算
- 归并排序求逆序对个数
- 编程算法 - 区间调度问题 代码(C)
- Windows下C++多线程同步与互斥简单运用
- Struts2配置文件讲解
- 黑马程序员——Java基础---多态,内部类,异常
- Android 6.0 新增API 简介(1)
- hugepage配置使用
- c++多线程同步使用的对象
- QQ 微信 新浪 无法 分享 收集
- 20151009 C# 第一篇 基础知识
- 将Word或Excel文件转换为PDF不用office
- 关于数据库增删改查练习
- Calculator
- C++ 函数参数传递 值传递,引用传递,地址传递
- (算法)精确表示小数