求高精度幂
Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 126980 Accepted: 30980
Description
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
Input
T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。
Output
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
解决思路
这是一道高精度的题,主要是处理前导0和末尾0的时候有点麻烦。例如100.00可能会处理成1。
/**
求高精度幂
Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 126980 Accepted: 30980
Description
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
Input
T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。
Output
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
解决思路
这是一道高精度的题,主要是处理前导0和末尾0的时候有点麻烦。例如100.00可能会处理成1。
程序使用:http://my.oschina.net/leopardsaga/blog/123495?fromerr=atjgdwtv
*/
#include "stdafx.h"
#include<stdio.h>
#include<math.h>
#include<string>
int len_r;
int* pow_s(int x,int n,int len);
int main(){
char num_c[6];
int N;
while(scanf("%s %d", num_c, &N) != EOF){
int position=0, i=0, num=0, j=0,len=0;
for (i=0; i<strlen(num_c); i++) {
if (num_c[i] == '.'){
position = (strlen(num_c) - 1 - i) * N; // calculate decimal point position after R^n
}
else{
num = num*10 + num_c[i] - 48; // transfer float to integer
if(num*10/1){
len++;
}
}
}
int* result = pow_s(num,N,len);
if(len_r < position){
printf("."); // print decimal point
for (i=0; i<position-len_r; i++){
printf("0"); // print zero between decimal point and decimal
}
//while (product[j] == 0) // trim trailing zeros{
// j++;
//}
for (i=len_r-1; i>=j; i--){
printf("%d", result[i]);
}
} else {
while (result[j]==0 && j<position){ // trim trailing zeros
j++;
}
for (i=len_r-1; i>=j; i--){
if (i+1 == position){ // cause index in C language starts from 0
printf(".");
}
printf("%d", result[i]);
}
}
free(result);
}
free(num_c);
return 0;
}
int* pow_s(int a,int n,int len){
int i,j,carry=0;
int* result = (int*)malloc(sizeof(int)*(len)*n);
result[0] = 1;
len_r = 1;
for (j = 0; j < n; j++){
for (i = 0; i < len_r; i++){
int temp = result[i]*a + carry;
result[i] = temp % 10;
carry = temp / 10;
}
while (carry){
result[i++] = carry % 10;
carry /= 10;
}
len_r = i;
}
return result;
}
程序使用:http://my.oschina.net/leopardsaga/blog/123495?fromerr=atjgdwtv