算法练习——ACM_1001_Exponentiation

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

posted @ 2016-04-15 19:19  竹青+  阅读(623)  评论(0编辑  收藏  举报