求高精度幂
来源:互联网 发布:react.js 中文文档 编辑:程序博客网 时间:2024/06/06 09:46
求高精度幂
时间限制:3000 ms | 内存限制:65535 KB
难度:2
- 描述
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < =n <= 25。- 输入
- 输入有多行,每行有两个数R和n,空格分开。R的数字位数不超过10位。
- 输出
- 对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
- 样例输入
95.123 120.4321 205.1234 156.7592 998.999 101.0100 12
- 样例输出
548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.126825030131969720661201
- 来源
- POJ
- 上传者
iphxer
原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=155
思路:主要用大数的乘法运算,先把小数r[]乘以十的方法转化为整数t存入,t乘以R[]中的每一位数取余再存入 数组R[]中,
保留进位加到下一位中(大数相乘步骤自己理解),输出时记好小数点的位置
#include<stdio.h> #include<string.h> int main() { int i, j, n, doc, ans[200]; //doc是逗号后面实际的位数 char s[20]; while( scanf( "%s %d", s, &n ) == 2 ){ if( n == 0 )//幂为0时结果为1 { printf( "1\n"); continue; } memset( ans, 0, sizeof(ans) ); int len = strlen(s); int real = 0;//是去掉小数点之后的实际整数 int flag1 = 1;//标记前面不是0的数 int flag = 0; //标记逗号出现 doc = 0; int k = 0; int sum = 0; //sum是小数点后面没有作用的0的个数 for( i = 0; i < len; i ++ ) if( s[i] == '.'){ flag = 1; break; } if( flag ){ //如果有逗号 for( i = len-1; i >= 0; i -- ){ if( s[i] == '0'&&flag1 ){ ++sum;continue; } else{ flag1 = 0; if( s[i] == '.' ){ doc = len-i-sum-1; //标记小数点的位置 continue; } } ans[k++] = s[i]-'0'; } } else{ //如果没逗号 for( i = len-1; i >= 0; i -- ){ ans[k++] = s[i]-'0';}}for( i = k-1; i >=0; i -- ) real = real*10+ans[i]; for( i = 1; i < n; i ++ ) //核心代码 { int c = 0; //临时结果进位的值初始化为0 for( j = 0; j < 199; j ++ ) //遍历整个数组计算每一位与底数相乘的结果相加存入数组{ int s = ans[j]*real+c; //计算每一位与底数相乘的临时结果ans[j] = s%10; //临时结果取余存入数组c = s/10; //进位的值} } for( i = 199; ans[i]==0&&i>=n*doc; i -- ); //查找小数点的位置,如果不存在小数点不为0的数为首位置 for( j = i; j >= 0; j -- )//逆序从最低位逐个输出{ if( j == n*doc-1 )//放入小数点printf( "." ); printf( "%d", ans[j] ); } printf( "\n" ); } return 0; }
0 0
- 求高精度幂
- 高精度求幂运算
- 求高精度幂
- 求高精度幂
- POJ1001 求高精度幂
- NYOJ - 求高精度幂
- NYOJ155-求高精度幂
- 求高精度幂
- 求高精度幂
- 【高精度求幂】
- 求高精度幂 POJ1001
- NYOJ155 求高精度幂
- 求高精度幂
- 求高精度幂数
- 求高精度幂
- 求高精度幂
- 求高精度幂
- 求高精度幂
- printf应用
- testNg之RetryListener
- js中几种实用的跨域方法原理详解
- UVA 400-Unix Is
- 新手入门正则
- 求高精度幂
- 一个操作系统的实现--保护模式
- 纯代码解释runloop
- spring用BeanNameAutoProxyCreator自动创建事务代理
- testNg之TestngRetry
- 独立成分分析ICA
- C#之 装箱拆箱
- nil、Nil、NULL与NSNull的区别
- UVA 408-Uniform Generator