UVA-748
题意:给出数字r和n, 求r^n。
解题思路:题目需要高精计算,先知道小数点在哪里(知道有几位小数,假设有m),然后无视掉小数点把所有数字进行高精乘。然后小数的位数为 n*m。
/*************************************************************************
> File Name: UVA-748.cpp
> Author: Narsh
>
> Created Time: 2016年07月18日 星期一 20时34分49秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,a[330],t[630000],la,lt,l,tmp[630000];
string s;
int main() {
while (cin>>s>>n) {
la=lt=0;
l=s.length();
memset(t,0,sizeof(t));
for (int i = 1; i <= l; i++)
if (s[l-i] != '.' ) {
la++;
a[la]=s[l-i] - '0';
lt++;
t[lt]=s[l-i] - '0';
} else m=i-1;
for (int q= 2; q <= n; q++) {
memset(tmp,0,sizeof(tmp));
for (int i = 1; i <= lt; i++)
for (int j = 1; j <= la; j++)
tmp[i+j-1]+=a[j]*t[i];
lt = lt+la-1;
for (int i = 1; i <= lt; i++) {
tmp[i+1]+=tmp[i]/10;
tmp[i]=tmp[i]% 10;
t[i] = tmp[i];
}
if (tmp[lt+1]) t[++lt] = tmp[lt];
while (!t[lt]) lt--;
}
int i=lt;
int ll = 1;
while (t[ll] == 0) ll++;
if (m*n > i) i = m*n;
for (;i >= ll; i--) {
if (i == m*n) printf(".");
printf("%d",t[i]);
}
printf("\n");
}
}