hdu 1063 Exponentiation 大数乘法

题意:输入两个数R和n,R长度为6(在一行1-6列),,n为整数(在一行7-8列)。求R^n。(其中99.999>R>0.0,25>=n>0)

要求:1)输出的整数部分为0时,不输出这个0;2)不输出前导零;3)小数部分没有后缀零;4)结果为整数是没有小数点

!!!我被坑的地方是,测试代码中存在这样的R,例如:123456,不在(0.0,99.999)范围内,好坑啊抓狂


题解:比较单纯的大整数乘法。一开始先去掉小数点,剩余的就是整数m,求的m^n。然后加小数。注意的是小数点位置,如果超过了大整数m^n长,需要补零。加上小数点后就是去掉小数的后缀零,以及在结果为整数时去掉小数点。


代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
const int maxn=2e4+10;
char a[10],c[1000];
int b[1000],t,k;
void mul(int m)//大数乘法
{
    int i,j;
    for(i=0;i<t;i++)
        b[i]=b[i]*m;
    int temp=0,x;
    for(i=0;i<t;i++)
    {
        x=b[i]+temp;
        b[i]=x%10;
        temp=x/10;
    }
    while(temp)
    {
        b[t++]=temp%10;
        temp=temp/10;
    }
}
void pows(int m,int n)//求m^n,并输出结果
{
    int i,j,num=0;
    for(i=2;i<=n;i++)
        mul(m);
    k=k*n;
    //判断小数点的位置
    if(k>=t)
    {
        c[num++]='.';
        for(i=k-1;i>=t;i--)c[num++]='0';
        for(i=t-1;i>=0;i--)c[num++]='0'+b[i];
    }
    else
    {
        for(i=t-1;i>=0;i--)
        {
            c[num++]='0'+b[i];
            if(i==k)c[num++]='.';
        }
    }
    //删除小数部分后缀零和多余的小数点
    while(c[num-1]=='0')num--;
    if(c[num-1]=='.')num--;
    c[num]='\0';
    printf("%s\n",c)
;}
int main()
{
    int n;
    while(scanf("%s%d",a,&n)!=EOF)
    {
        //if(n==0){printf("1\n");continue;}
        int i,j,m=0;
        for(i=0,k=0;i<6;i++)
        {
            if(a[i]=='.')
            {
                k=5-i;
                continue;
            }
            m=m*10+(a[i]-'0');
        }
        t=0;
        i=m;
        //if(m==0){printf("0\n");continue;}
        //printf("%d\n",m);
        while(i!=0)
        {
            b[t++]=i%10;
            i=i/10;
        }
        pows(m,n);
    }
    return 0;
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值