POJ-1001-Exponentiation
求实数的幂R^n,可以转化成求整数幂,结果中的小数点位置为R的小数位数*n,输出结果时在相应位置输出一个'.'即可。计算整数幂用大数乘法。
#include <stdio.h> #include <stdlib.h> #define MAX 125 #define BASE 6 unsigned int result[MAX]; unsigned int base[BASE]; unsigned int temp[MAX]; int main() { int exp,decimal; int i,j,c,outStart,inDec,showPoint; unsigned char input[BASE+1]; while(scanf("%s%d",input,&exp) == 2) { // init memset(base, 0, sizeof(base)); memset(result, 0, sizeof(result)); memset(temp, 0, sizeof(temp)); j = 0; outStart = 0; showPoint = 0; inDec = 0; // deal with input for(i=0; i<BASE; i++) { if(input[BASE-i-1] == '.') { decimal = i; continue; } base[j++] = input[BASE-i-1] - '0'; } for(i=0; i<BASE; i++) { temp[i] = base[i]; } // multiply exp times for(c=0; c<exp-1; c++) { for(i=0; i<MAX; i++) { // temp for(j=0; j<BASE; j++) { //base result[i+j] += temp[i] * base[j]; } } for(i=0; i<MAX; i++) { result[i+1] += result[i] / 10; result[i] = result[i] % 10; } memcpy(temp, result, sizeof(result)); memset(result, 0, sizeof(result)); } memcpy(result, temp, sizeof(result)); // output // 计算结果的小数位数 decimal *= exp; for(i=0; i<decimal; i++) { if(result[i]) { showPoint = 1; break; } } for(i=0; i<MAX; i++) { // 输出小数点 if(MAX-i == decimal) { // 整数情况 if(!showPoint) break; outStart = 1; printf("."); } if(MAX-i < decimal) inDec = 1; if(result[MAX-i-1] != 0) { outStart = 1; printf("%d", result[MAX-i-1]); } else { // 输出非前导0 if(outStart) { // 小数尾部无效0不输出 if(inDec) { c = MAX-i-1; while(!result[c] && c>0) c--; if(c == 0 && !result[0]) c = -1; if(c<0) break; } printf("%d", result[MAX-i-1]); } } } printf("\n"); } return 0; }