Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

拜托各位高手帮忙看看吧,能测得数据都测过了,也都通过了呀,可提交总是WA呀

Posted by dynaturtle at 2006-08-14 11:18:27 on Problem 1001
下面是源码:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH 1000

typedef struct NumberType
{
	int digit[LENGTH];
	int precision;
	int n;//refer the length of all
};
typedef NumberType* BigNumber;

void Multiply(BigNumber A,BigNumber B,BigNumber C);//C=A*B
void transform(char* str,BigNumber number);
void Print(BigNumber sum);
void clearzero(BigNumber A);

int main()
{
	char str[10];
	int power;
	BigNumber number,temp,sum;
	
	number=(BigNumber)malloc(sizeof(NumberType));
	temp=(BigNumber)malloc(sizeof(NumberType));
	sum=(BigNumber)malloc(sizeof(NumberType));

	while(cin>>str>>power)
	{
		int i,j;

		transform(str,number);
		for (j=0;j<LENGTH;j++)
			temp->digit[j]=number->digit[j];
		temp->n=number->n;
		temp->precision=number->precision;
		
		for(i=1;i<power;i++)
		{
			clearzero(number);
			clearzero(temp);
			Multiply(number,temp,sum);
			for (j=0;j<LENGTH;j++)
				temp->digit[j]=sum->digit[j];
				temp->n=sum->n;
				temp->precision=sum->precision;			
		}
		
		Print(sum);
	}

	return 0;
}

void Multiply(BigNumber A,BigNumber B,BigNumber C)
{
	int i,j,n;
	int carry1=0,carry2=0;//carry1 for mul, carry2 for add
	NumberType temp;
	BigNumber ptemp=&temp;

	for (i=0;i<LENGTH;i++)
		C->digit[i]=0;
	C->n=0;
	C->precision=0;

	for (i=0;i<A->n;i++)
	{
		for (j=0;j<B->n;j++)
		{
			C->digit[i+j]+=A->digit[i]*B->digit[j];
			C->digit[i+j+1]+=C->digit[i+j] / 10;
			C->digit[i+j] %= 10;
		}		
	}

	C->precision=A->precision+B->precision;
	n=A->n+B->n;
	while ((C->digit[n-1]==0)&&(n>C->precision)) n--;
	C->n=n;
}

void transform(char* str,BigNumber number)
{
	int i,j=-1,k=0;
	int length=strlen(str);

	for (i=length-1;i>=0;i--)
	{
		if (str[i]!='.')
			number->digit[length-1-i-k]=str[i]-'0';
		else 
		{
			j=i;
			k=1;
		}
	}
	
	if (j==-1)
	{
		number->n=length;
		number->precision=0;
	}
	else 
	{
		number->n=length-1;
		number->precision=number->n-j;
	}
}

void Print(BigNumber sum)
{
	int i;

	if (sum->n==0)
	{
		cout<<"0\n";
		return;
	}
	
	for (i=sum->n;i>0;i--)
	{
		if (i==sum->precision)
			cout<<'.';
		cout<<sum->digit[i-1];
	}
	cout<<endl;
}

void clearzero(BigNumber A)
{
	int i,pos;
	
    pos=0;
	while ((A->digit[pos]==0)&&(pos<A->precision))
		pos++;
	if (pos!=0)
	{
		for (i=pos;i<A->n;i++)
			A->digit[i-pos]=A->digit[i];
		A->n=A->n-pos;
		A->precision-=pos;
	}

}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator