POJ 1001 Exponentiation 大浮点数乘法

来源:互联网 发布:大富翁数据库 编辑:程序博客网 时间:2024/06/02 02:32

题目:

http://poj.org/problem?id=1001

题意:

给出一个浮点数,一个n,求这个浮点数的n次方,输出要求去掉多余的0,小数位为0的只输出整数,小数位不为0且整数位为0的,去掉整数位。

思路:

首先去掉多余的后缀0,然后记录有多少为小数,再把小数位去掉作为整数,模拟大整数乘法,之后加上相应的小数位。注意上述的格式

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 2010;void multiply(char *s1, char *s2, char *s3){    int len1 = strlen(s1), len2 = strlen(s2), len3 = 0;    reverse(s1, s1 + len1);    reverse(s2, s2 + len2);    for(int i = 0; i < len1+len2; i++) s3[i] = '0';    for(int i = 0; i < len1; i++)    {        int t = 0;        for(int j = 0; j < len2; j++)        {            t += (s1[i]-'0') * (s2[j]-'0');            s3[i+j] += t%10, t /= 10;            if(s3[i+j] > '9') s3[i+j] -= 10, t++;            len3 = max(len3, i+j);        }        if(t) s3[i+len2] += t, len3 = max(len3, i+len2);    }    s3[++len3] = '\0';    reverse(s1, s1 + len1);    reverse(s2, s2 + len2);    reverse(s3, s3 + len3);}int work(char *s){    char *p = strchr(s, '.');    if(p != NULL)    {        for(int i = strlen(s)-1; i >= 0; i--)        {            if(s[i] == '0') s[i] = '\0';            else break;        }    }    bool f = false;    int num = 0;    for(int i = 0; s[i]; i++)    {        if(s[i] == '.') f = true;        if(f) s[i] = s[i+1], num++;    }    return num == 0 ? num : num-1;}int main(){    int n;    char s1[N], s2[N], s3[N];    while(~ scanf("%s%d", s1, &n))    {        int num = work(s1);        s2[0] = '1', s2[1] = '\0';        for(int i = 1; i <= n; i++)        {            multiply(s1, s2, s3);            memcpy(s2, s3, sizeof s3);        }        int len = strlen(s3);        for(int i = len; i >= len - num*n; i--)            s3[i+1] = s3[i];        s3[len-num*n] = '.';        len = strlen(s3);        if(s3[len-1] == '.') s3[len-1] = '\0';        int idx = 0;        while(s3[idx] == '0') idx++;        if(idx == len-1) printf("0\n");//特判为0的情况        else printf("%s\n", s3 + idx);    }    return 0;}
0 0
原创粉丝点击