Exponentiation
Time Limit: 500MS | Memory Limit: 10000K | |
Total Submissions: 126980 | Accepted: 30980 |
Description
Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.
This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.
This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.
Input
The
input will consist of a set of pairs of values for R and n. The R value
will occupy columns 1 through 6, and the n value will be in columns 8
and 9.
Output
The
output will consist of one line for each line of input giving the exact
value of R^n. Leading zeros should be suppressed in the output.
Insignificant trailing zeros must not be printed. Don't print the
decimal point if the result is an integer.
Sample Input
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
Hint
If you don't know how to determine wheather encounted the end of input:
s is a string and n is an integer
s is a string and n is an integer
C++
while(cin>>s>>n)
{
...
}
c
while(scanf("%s%d",s,&n)==2) //to see if the scanf read in as many items as you want
/*while(scanf(%s%d",s,&n)!=EOF) //this also work */
{
...
}
翻译:
求高精度幂
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。
现在要你解决的问题是:对一个实数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。
源码
C++解题
1 /* 2 poj 1001 3 version:1.0 4 author:Knight 5 Email:S.Knight.Work@gmail.com 6 */ 7 8 #include<cstdio> 9 #include<cstring> 10 #include<cstdlib> 11 #include<memory.h> 12 using namespace std; 13 14 char Result[200];//存R^N的结果 15 16 //大实数的乘法,乘数为FirMultiplier和SecMultiplier,结果存在Result中 17 void HigRealMul(char* FirMultiplier, char* SecMultiplier, char* Result); 18 //剔除实数尾部的无效0或小数点 19 void CutInsignificantTail(char* StrR); 20 //计算小数点在实数中的位数 21 int CountPointIndex(char* StrR); 22 //删除实数中的小数点,PointIndex为小数点在实数中从右向左数的第几位 23 void DeletePoint(char* StrR, int PointIndex); 24 25 int main(void) 26 { 27 char StrR[10];//R对应的字符串 28 int N; 29 int i; 30 int PointIndex = 0;//记录小数点在实数中从右向左数的第几位,如1.26在第3位,4在第0位 31 32 while(scanf("%s%d", StrR, &N) != EOF) 33 { 34 memset(Result, 0, 200); 35 36 CutInsignificantTail(StrR); 37 38 PointIndex = CountPointIndex(StrR); 39 40 DeletePoint(StrR, PointIndex); 41 42 strcpy(Result, StrR); 43 44 for (i=2; i<=N; i++) 45 { 46 HigRealMul(Result, StrR, Result); 47 } 48 49 int Len = strlen(Result); 50 51 if (Len -(PointIndex - 1) * N < 0) 52 { 53 printf("."); 54 for (i = Len - (PointIndex - 1) * N; i<0; i++) 55 { 56 printf("0"); 57 } 58 } 59 60 for (i=0; i<Len; i++) 61 { 62 //输出小数点 63 if (i == Len -(PointIndex - 1) * N) 64 { 65 printf("."); 66 } 67 printf("%c", Result[i]); 68 } 69 printf(" "); 70 //printf("%s ", Result); 71 //printf("%d ", PointIndex); 72 } 73 return 0; 74 } 75 76 //大实数的乘法,乘数为FirMultiplier和SecMultiplier,结果存在Result中 77 void HigRealMul(char* FirMultiplier, char* SecMultiplier, char* Result) 78 { 79 80 char TmpResult[200]; 81 int i,j; 82 int k = -1;//控制TmpResult[]下标 83 int FirLen = strlen(FirMultiplier); 84 int SecLen = strlen(SecMultiplier); 85 86 memset(TmpResult, '0', 200); 87 88 //模拟乘法运算 89 for (i=SecLen-1; i>=0; i--) 90 { 91 k++; 92 93 int FirMul; 94 int SecMul = SecMultiplier[i] - '0'; 95 int Carry;//进位 96 97 for (j=FirLen-1; j>=0; j--) 98 { 99 FirMul = FirMultiplier[j] - '0'; 100 TmpResult[k + FirLen - 1 - j] += FirMul * SecMul % 10; 101 Carry = FirMul * SecMul / 10 + (TmpResult[k + FirLen - 1 - j] - '0') / 10; 102 TmpResult[k + FirLen - 1 - j] = (TmpResult[k + FirLen - 1 - j] - '0') % 10 + '0'; 103 TmpResult[k + FirLen - j] += Carry; 104 } 105 } 106 107 //防止某一位的值超过9 108 for (k=0; k<200; k++) 109 { 110 TmpResult[k + 1] += (TmpResult[k] - '0') / 10; 111 TmpResult[k] = (TmpResult[k] - '0') % 10 + '0'; 112 } 113 //将设置字符串结束符 114 for (k=199; k>=0; k--) 115 { 116 if ('0' != TmpResult[k - 1]) 117 { 118 TmpResult[k] = '