poj 1001 (Exponentiation) 高精度乘法

题目链接:点击打开链接

题目大意:求一个有理数的n次方

题目分析:这么大的数就是高精度乘法,然后有些具体的要求。用数组的方法。

题目总结:具体看下discuss里面的数据很不错。


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 20000
using namespace std;
int n,dot,len_a,len_b;
char str[10];
int a[maxn],b[maxn],tmp[maxn];
void init()
{
    memset(a,0,sizeof(a));//初始化
    memset(b,0,sizeof(b));
    dot=-1;
    for(int i=5,j=1; i>=0; i--)//转化
    {
        if(str[i]!='.') a[j]=b[j++]=str[i]-'0';//之前有点纠结j和j++的东西,等价于:a[j]=b[j]=str[i]-'0';j++;
        else dot=i;
    }
    if(dot==-1) len_a=len_b=6;
    else  len_a=len_b=5;
}
void multi()
{
    int i,j;
    memset(tmp,0,sizeof(tmp));
    for(i=1; i<=len_a; i++)
        for(j=1; j<=len_b; j++)
        {
            tmp[i+j-1]+=a[i]*b[j];
            if(tmp[i+j-1]>9)
            {
                tmp[i+j]+=tmp[i+j-1]/10;
                tmp[i+j-1]%=10;
            }
        }
    if(tmp[len_a+len_b-1]>9)
    {
        tmp[len_a+len_b]+=tmp[len_a+len_b-1]/10;
        tmp[len_a+len_b-1]%=10;
    }
    len_a=len_a+len_b;
    for(i=1; i<=len_a; i++) a[i]=tmp[i];

}
int main()
{
    int flag,i,j,head,tail;
    while(~scanf("%s%d",str,&n))
    {
        init();
        for( i=1; i<n; i++)  multi();

        if(dot==-1)
        {
            for(i=len_a; i>=1; i--)
            {
                printf("%d",a[i]);
            }
            printf("\n");
        }
        else
        {
            dot=5-dot;
            dot*=n;

            for(i=1; i<=len_a; i++)
            {
                if(a[i]!=0)
                {
                    tail =i;
                    break;
                }
            }
            for(j=len_a; j>=1; j--)
            {
                if(a[j]!=0)
                {
                    head =j;
                    break;
                }
            }
          
            if(head<dot){head=dot;}
            if(tail>dot){tail=dot+1;}
            for(j=head; j>=tail; j--)
            {
                if(j==dot)    printf(".");
                printf("%d",a[j]);
            }
            printf("\n");
        }

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值