大数乘法 748 - Exponentiation

UVa OJ

  Exponentiation 

Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.

This problem requires that you write a program to compute the exact value of Rn where R is a real number (0.0 < R < 99.999) and n is an integer such that $0 < n \le 25$.

Input 

The input will consist of a set of pairs of values for  R  and  n . The  R  value will occupy columns 1 through 6, and the  n  value will be in columns 8 and 9.

Output 

The output will consist of one line for each line of input giving the exact value of  R n . Leading zeros and insignificant trailing zeros should be suppressed in the 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


这道题就是写个函数,不断进行大数乘法。用字符串来出来比较方便

还有就是我没有在每次乘完之后处理前置0。以后注意


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctype.h>
#include<cmath>
int digit,t,len,mul[300];
char num[10],str[10],numb[300];
using namespace std;
int exp(int t)
{
    memset(mul,0,sizeof(mul));
    int i,j,lenb=strlen(numb);
    if (t==1) return 0;
    for (i=0; i<len; i++)
    {
        for (j=0; j<=lenb; j++)
        {
            if (isdigit(num[i]) && isdigit(numb[j])) mul[i+j]+=(num[i]-'0')*(numb[j]-'0');
            if (mul[i+j]>=10)
            {
                mul[i+j+1]+=mul[i+j]/10;
                mul[i+j]%=10;
            }
        }
    }
    for (i=0; i<=len+lenb+3; i++)
        numb[i]=mul[i]+48;
    numb[i]='\0';
    exp(t-1);
}
int main ()
{
    int i,j,k;
    while(scanf("%s %d",str,&t)!=EOF)
    {
        memset(mul,0,sizeof(mul));
        memset(num,0,sizeof(num));
        memset(numb,0,sizeof(numb));
        len=strlen(str);
        for (i=len-1,j=0; i>=0; i--)
            if (isdigit(str[i])) num[j++]=str[i];
            else k=i;
        num[j]='\0';
        digit=5-k;
        len--;
        strcpy(numb,num);
        exp(t);
        digit*=t;
        for (i=strlen(numb); i>=digit; i--)
            if (numb[i]!='0' && isdigit(numb[i])) break;
        for (j=i; j>=digit; j--) printf("%c",numb[j]);
        cout<<".";
        for (i=0; ; i++)
            if (numb[i]!='0') break;
        for (j=digit-1; j>=i; j--) printf("%c",numb[j]);
        cout<<endl;

    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值