hdu1063

#include<iostream>
#include<string>
using namespace std;  

struct BigReal        //高精度实数
{
    int len;           //长度
    int num[10000];
    int point;         //小数点位置
    BigReal()
    {
        len=1;
        point=0;
        memset(num,0,sizeof(num));
    }
};  

bool Read(BigReal& a)    //读入一个大实数
{
    string s;
    int t,i;  

    if(cin>>s)
    {
        a.len=s.size();
        a.point=0;
        t=0;
        for(i=s.size()-1;i>=0;i--)
        {
            if(s[i]==‘.‘)
            {
                a.len--;
                a.point=t;
                continue;
            }
            a.num[t++]=s[i]-‘0‘;
        }
        return true;
    }
    else
        return false;
}  

void Show(BigReal& a)
{
    int i,pos;  

    for(i=0;i<a.point && a.num[i]==0;i++) ;
    pos=i;
    if(a.point==a.len)
    {
        if(pos==a.point)
        {
            cout<<0<<endl;          //0.0000000的情况
            return ;
        }
        else
            cout<<‘.‘;              //0.121313114的情况
    }
    for(i=a.len-1;i>=0;i--)
    {
        cout<<a.num[i];
        if(i==pos) break;          //小数时后导零不输出
        if(i==a.point) cout<<‘.‘;
    }
    cout<<endl;
}  

BigReal Mul(const BigReal& a,const BigReal& b)
{
    int i,j,len=0;
    BigReal c;  

    for(i=0;i<a.len;i++)
        for(j=0;j<b.len;j++)
        {
            c.num[i+j]+=a.num[i]*b.num[j];
            if(c.num[i+j]>=10)
            {
                c.num[i+j+1]+=c.num[i+j]/10;
                c.num[i+j]%=10;
            }
        }
    c.point=a.point+b.point;
    len=a.len+b.len;
    while(c.num[len-1]==0 && len>1&&len>c.point) len--;   //处理长度,去掉前导零
    if(c.num[len]) len++;
    c.len=len;
    return c;
}  

int main()
{
    BigReal a;
    int b;  

    while(Read(a)&& scanf("%d",&b)==1)
    {
        BigReal ans;
        ans.num[0]=1;
        while(b--)
            ans=Mul(ans,a);
        Show(ans);
    }
    return 0;
}  
时间: 2024-11-08 20:15:47

hdu1063的相关文章

HDU1063 大数 java

Exponentiation Time Limit: 2000/500 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9107    Accepted Submission(s): 2654 Problem Description Problems involving the computation of exact values of very large magnitude

UVA+POJ中大数实现的题目,持续更新(JAVA实现)

UVA10494:If We Were a Child Again 大数除法加取余 import java.util.Arrays; import java.util.Scanner; import java.math.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger a,b; String s; while(cin.ha

ACM~大数加法&amp;&amp;hdu题目样例

提出问题:为什么要提出大数的运算?(注java中有大数类,这里不再讲解,题目代码中略有java代码) 答案:因为计算机的数字类型是有限制的,例如int:2^32-1; long long 2^64-1;(以C++数据类型为例),因此在某些运算中需要高精度的运算,此时大数的模拟运算就应运而生了.这里只谈一下大数的加法,首先给出大整数的加法,再给出大实数的加法. 1.大整数加法的模拟,这里模拟小学生加法运算,用字符串储存大整数的数值. 首先看一下小学生的加法:987 + 345 = 1332 从个位