求高精度幂
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