poj1001

本文介绍了一种解决大数幂运算问题的方法,利用数组模拟笔算乘法过程,实现任意精度的数值计算。适用于0.0-99.999范围内的数进行n次方运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem : Exponentiation

Description:题目的意思很好懂,给出一个0.0-99.999之间的数,然后给出一个n,求这个数的n次方。

Solution:看到数据这么大就知道用正常的int型肯定没办法做到。所以我们需要把输入的数一个一个的存进一个int型的数组,然后像我们笔算乘法一样,一个一个数字的去乘。例如我们算1234×1234的时候就会列以下算式。
这里写图片描述
我们在做这个题的时候也是这样,模拟我们列算式计算。

Code(C++):

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

string s;
int n,a[1000],b[10];
int ans[1000];
int sum[1000];
int i,j,k,t,right1;
int doc,length1,length2;
int doc1,doct;

int main()
{
    while(cin>>s>>n)
    {
        t=0;
        doc=-1;doc1=-1;
        right1=0;
        int length=s.size();
        for(i=length-1; i>=0; i--)
        {
            if(s.at(i)=='.')
            {
                doc=i;
                continue;
            }
            a[t]=s.at(i)-'0';
            b[t]=s.at(i)-'0';
            t++;
        }
        //去掉尾部多余的零
        if(doc==-1)
            length1=length2=t;
        else
        {
            for(i=0; i<t; i++)
            {
                if(i<(t-doc)&&a[i]==0)
                    continue;
                else
                {
                    doc1=i;
                    break;
                }
            }
            for(; i<t; i++)
            {
                a[right1]=a[i];
                b[right1]=a[i];
                right1++;
            }
            length1=length2=right1;
        }
        doct=(length-doc-doc1-1)*n;
        if(n==1)
        {
            for(i=length1-1; i>=0; i--)
                cout<<a[i];
            cout<<endl;
            continue;
        }
        else if(n==0)
        {
            cout<<"0"<<endl;
            continue;
        }
        //这里减一是因为我们算平方时,只需要乘一次,三次方时也只需要乘两次,以此类推,所以需要减一
        n-=1;
        while(n--)
        {
            int r=0;
            memset(sum,0,sizeof(sum));
            for(i=0; i<length1; i++)
            {
                for(j=0; j<length2; j++)
                {
                    sum[i+j]+=a[i]*b[j]+r;
                    if(sum[i+length2-1]>9)
                    {
                        sum[i+length2]=sum[i+length2-1]/10;
                        sum[i+length2-1]%=10;
                    }
                    r=sum[i+j]/10;
                    sum[i+j]=sum[i+j]%10;
                }
            }
            if(sum[length1+length2-1]>9)
                {
                    sum[length1+length2]=sum[length1+length2-1]/10;
                    sum[length1+length2-1]%=10;
                }
            length1+=length2;
            for(i=0; i<length1; i++)
                a[i]=sum[i];

        }
        //去掉前边多余的零
        for(i=length1;i>=0;i--)
        {
            if(sum[i]==0&&i>=doct)
                continue;
            else
                break;
        }
        for(; i>=0; i--)
            {
                if(i==doct-1)
                    cout<<".";
                cout<<sum[i];
            }
        cout<<endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值