对应POJ题目:点击打开链接
Time Limit: 500MS | Memory Limit: 10000K | |
Total Submissions: 141986 | Accepted: 34699 |
Description
Input
Output
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
题意:求实数的n次方。n<=25
思路:去掉前0后0和小数点,记录小数点位置,即为基本大数乘法。
#include<cstdio> #include<cstdlib> #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 10 #define L 200 char r[M]; int t[L]; char ans[L]; int n; void Init(char *R, int &p) { char tmp[M]; memset(tmp, '\0', sizeof(tmp)); int i, u = 0; int len = strlen(R); int end; for(i=0; i<len; i++) if(R[i] == '.') break; if(i != len) for(i=len-1; i>=0; i--) if(R[i] != '0') break; end = i; for(; i>=0; i--){ if(R[i] == '.') p = i; else tmp[u++] = R[i]; } int ok = 0; while('0' == tmp[u-1]){ ok = 1; tmp[u-1] = '\0'; u--; } for(i=0; i<u/2; i++){ int x = tmp[i]; tmp[i] = tmp[u-i-1]; tmp[u-i-1] = x; } strcpy(R, tmp); p = end - p; } void Mul(char *A, const char *R) { memset(t, 0, sizeof(t)); int i, j, k = 0, u = -1; int lenA = strlen(A); int lenR = strlen(R); for(i=lenR-1; i>=0; i--){ k = ++u; for(j=lenA-1; j>=0; j--){ t[k++] += (R[i] - '0') * (A[j] - '0'); } } for(i=0; i<k; i++){ t[i+1] += t[i] / 10; t[i] %= 10; } if(t[k]) k++; for(i=0; i<k/2; i++){ int x = t[i]; t[i] = t[k-i-1]; t[k-i-1] = x; } for(i=0; i<k; i++) A[i] = char(t[i] + '0'); } void Pow(const char *R, int N, char *A) { strcpy(A, R); N--; int i; for(i=0; i<N; i++) Mul(A, R); } void Print(int p, const char *A) { p; int i; int len = strlen(A); int set_point = len - p; if(set_point <= 0){ printf("."); for(i=0; i< -set_point; i++) printf("0"); } for(i=0; i<len; i++){ if(i == set_point){ printf("."); } printf("%c", A[i]); } printf("\n"); } int main() { freopen("in.txt","r",stdin); while(~scanf("%s%d", r, &n)) { memset(t, 0, sizeof(t)); memset(ans, '\0', sizeof(ans)); int p; /* 记录小数点位置 */ Init(r, p); /* 把小数点后的尾0去掉,把第一个非零数字之前的0去掉*/ Pow(r, n, ans); /* ans = r^n */ Print(p*n, ans); } return 0; }