zoukankan      html  css  js  c++  java
  • 算法练习——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

  • 相关阅读:
    亚马逊EMR学习网站
    python实现redis三种cas事务操作
    【转】Jython简单入门
    【转】Android 收集已发布程序的崩溃信息
    【转】Android 避免APP启动闪黑屏(Theme和Style)
    【转】Android内存机制分析2——分析APP内存使用情况
    【转】Android内存机制分析1——了解Android堆和栈
    【转】JAVA Socket用法详解
    【转】JAVA 网络编程
    Android 无法Bind Service
  • 原文地址:https://www.cnblogs.com/zhuqingqin/p/5396650.html
Copyright © 2011-2022 走看看