hdoj1063&&poj1001 Exponentiation(大数据的处理,浮点数的幂高精确度表示)

很奇怪,我的代码在poj上能ac在hdoj上却ac不了,题目是完全一样的啊。。。

蛋疼呀!(/ □ \)

思路:这道题不难,但有几种情况要考虑。

1.得到的数是整数,不需要输出小数点

2.小数点前没有整数

3.小数点前有整数

我先把浮点数转化为整数,比如1.0100变为101,并记录小数点的位置,然后用处理大数相乘的方法,设一个数组a[],

将个位的1存在a[0],十位的0存在a[1],百位的1存在a[2]。再进行乘操作,每位都乘以101,乘完后进行进位处理。如此

循环操作,最后得到解。

额,无奈的代码

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
	long long a[130];
	char str[7];
	int n,r1,r2;
	int w,i,len,n1,d,x,x1;
	while(~scanf("%s%d",str,&n))
	{
		memset(a,0,sizeof(a));
		i=0;w=0;x=5;
		for(x=5;x>=0;x--)
		{
			if(str[x]!='0')break;
		}x1=x;
		while(str[x]!='.'&&x>=0)
		{
			w++;x--;
		}
	    for(x=x1;x>=0;x--)
	    {
    		if(str[x]=='.')continue;
    		a[i]=str[x]-'0';i++;
    	}
    	r1=a[0]+10*a[1]+100*a[2]+1000*a[3]+10000*a[4]+100000*a[5];
		len=i;n1=n;n=n-1;
		while(n--)
		{
			for(i=0;i<len;i++)
			a[i]*=r1;
			long long temp,k=0;
			for(i=0;i<len;i++)
			{
				temp=k+a[i];
				a[i]=temp%10;
				k=temp/10;
			}
			while(k)
			{
				a[len++]=k%10;
				k=k/10;
			}	
		}
		w=w*n1;
		d=len-w;
		if(w==0)
		{
		   for(x=len-1;x>0;x--)
		   printf("%lld",a[x]);
		   printf("%lld\n",a[x]);
		}
		else
		{
			if(d>0)
		{
		for(x=len-1;x>=len-d;x--)
		printf("%lld",a[x]);
		printf(".");
		for(;x>0;x--)
		printf("%lld",a[x]);
		printf("%lld\n",a[x]);
		}
		else
		{
			printf(".");
			for(x=0;x<-d;x++)
			printf("0");
			for(x=len-1;x>0;x--)
			printf("%lld",a[x]);
		    printf("%lld\n",a[x]);
		}	
		}		
	}
	return 0;
}

都能通过的代码:

#include<string>
#include<memory>
using namespace std;
#include<math.h>
#include<stdio.h>
#define DEPTH 1000000000
int exponent,value,fractionalLen;
__int64 result[25];
void multi()
{
 
    for(int i=1;i<exponent;i++)
    {
        int assist=0;
        for(int j=1;j<=result[0];j++)
        {
            result[j]=result[j]*value+assist;
            assist=result[j]/DEPTH;
            result[j]=result[j]%DEPTH;
        }
        if(assist>0)
        {
            result[0]++;
            result[result[0]]=assist;
        }
    }
}
int main()
{
    //freopen("Exponentiation.txt","r",stdin);
    char vtemp[7];
    while(scanf("%s%d",&vtemp,&exponent)!=EOF)
    {
        memset(result,0,sizeof(result));
        value=0;
        fractionalLen=0;
        for(int i=5,cnt=0;i>=0;i--)
        {
            if(vtemp[i]>='0'&&vtemp[i]<='9')
            {
                value=value+(vtemp[i]-'0')*pow(10.0,cnt);
                cnt++;
            }
            else
                fractionalLen=5-i;
        }
        while(value%10==0&&fractionalLen>0)
        {
            value/=10;
            fractionalLen--;
        }
        result[1]=value;
        result[0]=1;
        multi();
        fractionalLen*=exponent;
        char assist[10];
        sprintf(assist,"%d",result[result[0]]);
        string answer(assist);
        int len=(result[0]-1)*9+strlen(assist);
        for(int i=result[0]-1;i>=0;i--)
        {
            sprintf(assist,"%9d",result[i]);
            answer+=assist;
        }
        if(fractionalLen>len)
        {
            printf(".");
            for(int i=fractionalLen-len;i>0;i--)
                printf("0");
        }
        for(int i=0;i<len;i++)
        {
            if(i==len-fractionalLen)
                printf(".");
            if(answer[i]==' ')
                printf("0");
            else
                printf("%c",answer[i]);
        }
        printf("\n");
    }
    return 0;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值