POJ 1001 解题报告

这是一道基础的高精度的题目。对于高精度的题目,头脑一定要清晰,一定要细心。这种题,错的话还是比较难改的(除非用DEBUG,好吧,我用了……)。

基本思路就是把所有的数字反过来存放在字符串数组中,然后一位一位的模拟手算。

要注意的是:

1、字符‘n’和数字n之间的转换要搞清;

2、每次更新是尽量把数组清零,否则可能使上一次运算的结果影响这一次的运算。

         另外,高精度的题还要尽量减少计算量,高精度的题目本来效率就是比较低的,很容易TLE。

再贴下本人代码,比较乱……

#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
	return a>b?a:b;
}
void rev(char num[],int n)
{
	char temp[6]={0};
	int i;
	for (i=0;i<n;++i)
		temp[n-1-i]=num[i];
	for (i=0;i<n;++i)
		num[i]=temp[i];
}
void add(char x1[],char x2[])
{
	int i,j,r,cf=0;
	char temp[200]={0};
	for (i=0;i<max(strlen(x1),strlen(x2));++i)
	{
		r=(x1[i]==0?'0':x1[i])+(x2[i]==0?'0':x2[i])-'0'-'0'+cf;
		temp[i]=r%10+'0';
		cf=r/10;
	}
	temp[i]=cf;
	memcpy(x1,temp,sizeof(temp));
}
void mul(char x1[],char x2[])
{
	int i,j,r,cf,p=0,k;
	char temp[200]={0},last[200]={0};
	for (i=0;i<strlen(x1);++i)
	{
		cf=0;
		k=p;
		for (j=0;j<k;++j)
			temp[j]='0';
		for (j=0;j<strlen(x2);++j)
		{
			r=(x1[i]-'0')*(x2[j]-'0')+cf;
			temp[k++]=r%10+'0';
			cf=r/10;
		}
		temp[k]=cf+'0';
		add(temp,last);	
		++p;
		memcpy(last,temp,sizeof(temp));
	}
	memcpy(x1,temp,sizeof(temp));
}
void pow(char x[],char ans[],int n)
{
	int i;
	char temp[200]={'1'};
	for (i=0;i<n;++i)
		mul(temp,x);
	memcpy(ans,temp,sizeof(temp));
}
bool test1(char temp[],int d)
{
	int sum=0,i;
	for (i=4;i>=d;--i)
		sum+=temp[i]-'0';
	if (sum==0)
		return true;
	return false;
}
bool test2(char temp[],int d)
{
	int sum=0,i;
	for (i=d-1;i>=0;--i)
		sum+=temp[i]-'0';
	if (sum==0)
		return true;
	return false;
}
void print(char temp[],char ans[],int d,int n)
{
	int i,j,flag_int=0,flag_dig=0;
	int p=d*n;
	if (test1(temp,d))
		flag_int=1;
	if (test2(temp,d))
		flag_dig=1;
	if (flag_int&&flag_dig)
	{
		printf("0\n");
		return;
	}
	int len=strlen(ans);
	for (i=199;(ans[i]==0||ans[i]=='0')&&i>=p;--i);
	for (j=0;ans[j]=='0'&&j<p;++j);
	while (j<=i)
	{
		if (i==p-1)
			printf(".");
		printf("%c",ans[i]);
		--i;
	}
	printf("\n");
}
int main()
{
	char num[7],ans[200],temp[200]={0};
	int n,d,i;						//d:小数位数
	while (scanf("%s %d",num,&n)!=EOF)
	{
		memset(ans,0,sizeof(ans));
		memset(temp,0,sizeof(temp));
		for (i=5;num[i]!='.';--i)
			temp[i-1]=num[i];
		d=5-i;
		while (i--)
			temp[i]=num[i];
		rev(temp,5);
		pow(temp,ans,n);
		print(temp,ans,d,n);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值