求高精度幂
时间限制:
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 上传者
原题链接: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; }