欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

算法练习——ACM_1001_Exponentiation

发布时间:2025/6/15 62 豆豆
生活随笔 收集整理的这篇文章主要介绍了 算法练习——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: 30980Description 对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。现在要你解决的问题是:对一个实数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 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

转载于:https://www.cnblogs.com/zhuqingqin/p/5396650.html

总结

以上是生活随笔为你收集整理的算法练习——ACM_1001_Exponentiation的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。