生活随笔
收集整理的這篇文章主要介紹了
算法练习——ACM_1001_Exponentiation
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
求高精度冪
Time Limit: 500MS ?? ? ??? ?Memory Limit: 10000K
Total Submissions: 126980 ?? ? ??? ?Accepted: 30980
Description
對數(shù)值很大、精度很高的數(shù)進(jìn)行高精度計(jì)算是一類十分常見的問題。比如,對國債進(jìn)行計(jì)算就是屬于這類問題。
現(xiàn)在要你解決的問題是:對一個(gè)實(shí)數(shù)R( 0.0 < R < 99.999 ),要求寫程序精確計(jì)算 R 的 n 次方(Rn),其中n 是整數(shù)并且 0 < n <= 25。
Input
T輸入包括多組 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。
Output
對于每組輸入,要求輸出一行,該行包含精確的 R 的 n 次方。輸出需要去掉前導(dǎo)的 0 后不要的 0 。如果輸出是整數(shù),不要輸出小數(shù)點(diǎn)。
?
解決思路
? 這是一道高精度的題,主要是處理前導(dǎo)0和末尾0的時(shí)候有點(diǎn)麻煩。例如100.00可能會處理成1。
/**
求高精度冪
Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 126980 Accepted: 30980Description
對數(shù)值很大、精度很高的數(shù)進(jìn)行高精度計(jì)算是一類十分常見的問題。比如,對國債進(jìn)行計(jì)算就是屬于這類問題。現(xiàn)在要你解決的問題是:對一個(gè)實(shí)數(shù)R( 0.0 < R < 99.999 ),要求寫程序精確計(jì)算 R 的 n 次方(Rn),其中n 是整數(shù)并且 0 < n <= 25。Input
T輸入包括多組 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。Output
對于每組輸入,要求輸出一行,該行包含精確的 R 的 n 次方。輸出需要去掉前導(dǎo)的 0 后不要的 0 。如果輸出是整數(shù),不要輸出小數(shù)點(diǎn)。解決思路這是一道高精度的題,主要是處理前導(dǎo)0和末尾0的時(shí)候有點(diǎn)麻煩。例如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 integerif(num*10/1){len++;}} }int* result = pow_s(num,N,len);if(len_r < position){printf("."); // print decimal pointfor (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 zerosj++;}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
轉(zhuǎn)載于:https://www.cnblogs.com/zhuqingqin/p/5396650.html
總結(jié)
以上是生活随笔為你收集整理的算法练习——ACM_1001_Exponentiation的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。