UVA 748 Exponentiation

来源:互联网 发布:数据采集器 编辑:程序博客网 时间:2024/05/21 17:02

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");    }}
0 0
原创粉丝点击