HDOJ 1063 && POJ 1001

HDOJ1063和POJ1001是相同的题目,但是就此题而言,POJ的数据要弱于HDOJ。

此题是高精度幂运算,在POJ上能AC的代码却在HDOJ上AC不了,后来仔细阅读题目才发现,程序中没有处理前导0的部分,就是说001.01得处理为1.01。

经过实际测试,加上处理前导0的功能,既可以在HDOJ上AC,也可以在POJ上AC;如果不加处理前导0的功能,只能在POJ上AC。这就是许多像我一样的同学的代码在HDOJ上通不过的原因。

 

下面是在HDOJ上可AC代码:

#include <stdio.h>
#include <string.h>

void add(char temp1[],char temp2[],int m);    //两大数相加
void mul(char des[],char src[]);              //两大数相乘
void reverse(char *src);			//字符串逆置
void process1(char des[],int m);              //处理带小数的情况
void process2(char des[],int m);              //处理纯小数的情况
int leading_zeros(char r[]);                  //将前导0去掉,返回前导0的个数

int main()
{
	char des[1024],src[1024],r[8];
	int n,i,j,flag,m,t,count;
	while(scanf("%s %d",r,&n)!=-1)
	{
		count=leading_zeros(r);
		t=6-count;
		flag=0;//整数
		for(j=0,i=0;i<t;i++)
		{
			if(r[i]=='.')
			{
				flag=1;//带小数
				m=t-1-i;
				continue;
			}
			src[j]=r[i];
			j++;
		}
		m=m*n;
		src[j]='\0';
		if(src[0]=='0')
		{
			flag=2;//纯小数
			for(i=0;i<t-2;i++)
				src[i]=src[i+1];
			src[i]='\0';
		}
		reverse(src);
		strcpy(des,src);
		for(i=1;i<n;i++)
		{
			mul(des,src);
		}
		if(flag==0)
		{
			reverse(des);
			printf("%s\n",des);
		}
		else if(flag==1)
		{
			process1(des,m);
		}
		else 
		{
			process2(des,m);
		}
	}
	return 0;
}

int leading_zeros(char r[])
{
	int t,count,i;
	for(i=0;i<6;i++)
	{
		if(r[i]=='0'&&r[i+1]!='.')
			continue;
		break;
	}
	count=i;
	t=6-count;
	for(i=0;i<t;i++)
		r[i]=r[i+count];
	r[i]='\0';
	return count;
}

void process1(char des[],int m)
{
	int i,n,count=0,t;
	n=strlen(des);
	for(i=0;i<m;i++)
	{
		if(des[i]=='0')
		{
			count++;
		}
		else
			break;
	}
	t=n-m;
	reverse(des);
	des[n-count]='\0';
	n=strlen(des);
	for(i=0;i<t;i++)
	{
		printf("%c",des[i]);
	}
	if(t!=n)
		printf(".");
	for(i=t;i<n;i++)
		printf("%c",des[i]);
	printf("\n");
}

void process2(char des[],int m)
{
	int i,n,count=0,t;
	n=strlen(des);
	for(i=0;i<n;i++)
	{
		if(des[i]=='0')
		{
			count++;
		}
		else
			break;
	}
	t=m-n;
	reverse(des);
	des[n-count]='\0';
	n=strlen(des);
	if(n!=0)
	{
		printf(".");
		for(i=0;i<t;i++)
			printf("0");
		for(i=0;i<n;i++)
			printf("%c",des[i]);
	}
	else
		printf("0");
	printf("\n");

}

void mul(char des[],char src[])
{
	char temp1[1024],temp2[1024];
	int n,m,i,j,a,b,t;
	n=strlen(src);
	m=strlen(des);
	for(i=0;i<1024;i++)
		temp1[i]=temp2[i]='\0';
	for(i=0;i<n;i++)
	{
		a=b=0;
		for(j=0;j<m;j++)
		{
			t=(des[j]-'0')*(src[i]-'0')+a;
			a=t/10;
			b=t%10;
			temp2[j]=b+'0';
		}
		if(a!=0)
		{
			temp2[j]=a+'0';
			temp2[j+1]='\0';
		}
		else
		{
			temp2[j]='\0';
		}
		add(temp1,temp2,i);
	}
	strcpy(des,temp1);
}

void add(char temp1[],char temp2[],int m)
{
	char temp[1024];
	int n1,n2,i,a,b,t;
	n1=strlen(temp1);
	n2=strlen(temp2);
	if(m!=0)
	{
		for(i=n2+m-1;i>=m;i--)
			temp2[i]=temp2[i-m];
		for(i=m-1;i>=0;i--)
			temp2[i]='0';
		temp2[n2+m]='\0';
	}
	n2=strlen(temp2);
	a=b=0;
	if(n1<n2)
	{
		for(i=0;i<n1;i++)
		{
			t=temp1[i]-'0'+temp2[i]-'0'+a;
			a=t/10;
			b=t%10;
			temp[i]=b+'0';
		}
		for(i=n1;i<n2;i++)
		{
			t=temp2[i]-'0'+a;
			a=t/10;
			b=t%10;
			temp[i]=b+'0';
		}
		if(a!=0)
		{
			temp[i]=a+'0';
			temp[i+1]='\0';
		}
		else
		{
			temp[i]='\0';
		}
	}
	else
	{
		for(i=0;i<n2;i++)
		{
			t=temp1[i]-'0'+temp2[i]-'0'+a;
			a=t/10;
			b=t%10;
			temp[i]=b+'0';
		}
		for(i=n2;i<n1;i++)
		{
			t=temp2[i]-'0'+a;
			a=t/10;
			b=t%10;
			temp[i]=b+'0';
		}
		if(a!=0)
		{
			temp[i]=a+'0';
			temp[i+1]='\0';
		}
		else
		{
			temp[i]='\0';
		}
	}
	strcpy(temp1,temp);
}

void reverse(char *src)
{
	int i,n,m;
	char t;
	n=strlen(src);
	m=n/2;
	for(i=0;i<m;i++)
	{
		t=src[i];
		src[i]=src[n-i-1];
		src[n-i-1]=t;
	}
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值