hdu-1063(大数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063

思路:1、大数乘法模板

2、考虑小数点的位置

3、乘法前后判断前后道0

参考文章:https://blog.csdn.net/z8110/article/details/50167049

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[707],b[707],c[707];
char s[10];

void f(int a[])
{
    int i,j,k;
    memset(c,0,sizeof(c));
    for(i=0;i<10;i++)
    {
        for(j=0;j<200;j++)
        c[i+j]+=a[i]*b[j];
    }
    
    for(i=0;i<200;i++)
    {
        if(c[i]>=10) c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    for(i=0;i<300;i++)
    {
        b[i]=c[i];
    }
}

int main(void)
{
    int i,j,cnt,p1,p2,n;
    while(~scanf("%s%d",s,&n))
    {
        //初始化 
        int l=strlen(s);
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        cnt=0;
        for(i=l-1;i>=0;i--) 
        if(s[i]=='.') cnt=l-1-i; // 判断小数点位置 
        //判断是否是小数 
        p1=0;
        for(i=l-1;i>=0;i--) //判断后导零 
        if(s[i]!='0') break;
        if(s[i]=='.') p1=1;
        for(i=l-1;i>=0;i--)
        {
            if(s[i]=='.') break;
        }
        if(i==-1) p1=1;
        
        //乘法计算 
        b[0]=1;
        for(j=0,i=l-1;i>=0;i--)
        if(s[i]>='0'&&s[i]<='9') a[j++]=s[i]-'0';
        for(i=0;i<n;i++)
        f(a);
        
        //输出 
        for(i=200;i>=cnt*n;i--)
        if(b[i]) break;
        for(;i>=cnt*n;i--)
        printf("%d",b[i]);
        if(p1==0)
        printf("."); //输出小数点 
        for(;i>=0;i--) //判断,保证不输出前导零 
        {
            p2=0;
            for(j=i;j>=0;j--)
            {
                if(b[j]) 
                {
                    p2=1;
                    break;
                }
            }
            if(p2) printf("%d",b[i]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/2018zxy/p/9751171.html
今日推荐