poj1001高精度乘法
2016-03-23 21:25
591 查看
1.题目
问题简述:
对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
输入要求:
输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。
输出要求:
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
输入样例:
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
输出样例:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
题目来源: http://poj.org/problem?id=1001&lang=zh-CN&change=true
2.解题思路
数字利用的是科学记数法的思想,但是做的变化有所不同,做法是把小数点后的数字位数存为e,然后把数字存入数组。例如:
95.123 存为 a[200] = {3,2,1,5,9} e = 3
小数点的位置和数字的乘法就可以分开考虑了,比如算95.123,经过我上一步的处理就转化为计算95123的12次方,然后再计算乘方后小数点后数字的位数。
对于后一个为题很简单,结果就是e*n。
计算整数的乘方用了两个函数,一个是计算两个整数相乘的,一个是快速幂,后者调用前者计算乘法。
输出的时候注意要满足要求,这个并不难。
这个代码其实思路不难,但是写起来细节比较多,我的IDE调试功能有问题,可能需要改配置,不然debug的时候不会停。然后我就是用把中间结果print出来做的调试,耽误了不少时间。总共调试用了小半天的时间。
3.C语言代码
问题简述:
对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
输入要求:
输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。
输出要求:
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
输入样例:
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
输出样例:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
题目来源: http://poj.org/problem?id=1001&lang=zh-CN&change=true
2.解题思路
数字利用的是科学记数法的思想,但是做的变化有所不同,做法是把小数点后的数字位数存为e,然后把数字存入数组。例如:
95.123 存为 a[200] = {3,2,1,5,9} e = 3
小数点的位置和数字的乘法就可以分开考虑了,比如算95.123,经过我上一步的处理就转化为计算95123的12次方,然后再计算乘方后小数点后数字的位数。
对于后一个为题很简单,结果就是e*n。
计算整数的乘方用了两个函数,一个是计算两个整数相乘的,一个是快速幂,后者调用前者计算乘法。
输出的时候注意要满足要求,这个并不难。
这个代码其实思路不难,但是写起来细节比较多,我的IDE调试功能有问题,可能需要改配置,不然debug的时候不会停。然后我就是用把中间结果print出来做的调试,耽误了不少时间。总共调试用了小半天的时间。
3.C语言代码
#include <stdio.h> #include <stdlib.h> int len(int*a,int n) //查看数字a的实际长度 无错误 { int i; for(i=n-1;i>=0;i--) if(a[i]!=0) break; if(i<0) return 1; else return i+1; } void mult(int*a,int*b) //将a和b相乘的结果存入a中 无错误 { int c[500]={0}; int i,j; int la,lb,lc; int tmp; la = len(a,200); lb = len(b,200); for(i=0;i<lb;i++) { for(j=0;j<la;j++) { tmp = a[j]*b[i] + c[i+j]; c[i+j] = tmp%10; c[i+j+1] += tmp/10; } } if(c[la+lb-1]==0) lc = la + lb - 1; else lc = la + lb; if(lc<=200) { for(i=0;i<lc;i++) a[i] = c[i]; } } void q_power(int*a,int n) //快速幂:将结果存回a { int b[200]={1}; //存储中间结果 int i; while(n>0) { if(n%2==1) { mult(b,a); } mult(a,a); n /= 2; } for(i=0;i<200;i++) a[i] = b[i]; } int main() { int a[200]={0}; //初始化 int i,j; int n; //幂次 int e; //科学计数法 int p,q; char s[10]; while(scanf("%s %d",s,&n)!=EOF) { //初始化a for(i=0;i<200;i++) a[i] = 0; //处理读入数据 e = 0; j = 0; for(i=5;i>=0 && s[i]!='.';i--) { a[j++] = s[i] - '0'; e++; } if(i<0) e = 0; for(i=i-1;i>=0;i--) { a[j++] = s[i] - '0'; } //快速幂计算乘方 q_power(a,n); //重新计算e e = n*e; //输出结果 //寻找i、j for(i=200-1;i>=0;i--) if(a[i]!=0) break; for(j=0;j<200;j++) if(a[j]!=0) break; p = i>(e-1)?i:(e-1); q = e>j?j:e; //输出小数点前的数字 for(i=p;i>=q;i--) if(i>=e) printf("%d",a[i]); else break; //输出小数点 if(i>=q) printf("."); //输出小数点后的数字 for(;i>=q;i--) printf("%d",a[i]); printf("\n"); } return 0; }
相关文章推荐
- CODEFORCES 580E Kefa and Watch
- Bzoj3236:[Ahoi2013]作业:莫队算法+树状数组
- Java四舍五入
- static( 用法看了就会的解释)extern 局部变量 全局变量联系还有auto
- sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)
- JVM类加载的双亲委派模型
- problemG
- EasyMusicPlayer
- 毕业设计2-我要做的是个什么玩意儿
- codevs 3641 上帝选人
- 作业3(论代码规范)
- Qt学习笔记--Qt安装--记得重启
- iOS-常见加密总结
- java Dom 解析xml文档,实现xml文档结点的增删改查,遍历
- Linux下SVN Server 的使用及权限配置权限
- meta name的含义:<META http-equiv=Content-Type content="text/html; charset=gb2312">
- 个人所得税
- SELinux配置property
- 第四周项目一求最大公约数
- Android——布局(线性布局linearLayout,表格布局TableLayout,帧布局FrameLayout)