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

终于过了!

Posted by 19891101 at 2012-07-13 16:18:45 on Problem 1396
#include <iostream>
#include <string.h>
#include <stdio.h>
#define max(x,y) ((x)>(y)?(x):(y))
using namespace std;

char s1[510],s2[510],s[1010];
int t;



//加法:Add(int A[],int a,int B[],int b,int C[],int &c)
//参数:相加的两个数字(正数)A和B,以及位数a和b(A[1]…A[a],B[1]…B[b]),保存结果的C和结果的位数c。
//返回:无。相加的结果保存在C[]中,结果的位数保存在c中
void Add(int A[],int a,int B[],int b,int C[],int &c)
{
	int i,j,k,*p,*q;

	if(a<b)
		k=a,a=b,b=k,p=B,q=A;
	else p=A,q=B;
	for(C[0]=0,c=a,i=1;i<=a;i++) C[i]=p[i];
	for(i=a,j=b;j>=1;j--,i--) C[i]+=q[j];
	for(i=a;i>=0;i--)C[i-1]+=C[i]/10,C[i]%=10;
	if(C[0]) for(c++,i=c;i>=1;i--) C[i]=C[i-1];
	for(i=1;!C[i]&&i<=c;i++);
	k=i,c-=i-1;
	for(i=1;i<=c;i++) C[i]=C[k+i-1];
	if(c<=0) c=1,C[1]=0;
}

void add()
{
	int A[510],a,B[510],b,C[510],c,i;
	a=strlen(s1);
	for(i=0;i<a;i++) A[i+1]=s1[i]-'0';
	b=strlen(s2);
	for(i=0;i<b;i++) B[i+1]=s2[i]-'0';
	Add(A,a,B,b,C,c);
	int t=max(a,max(b+1,c));
	for(i=1;i<=t-a;i++) putchar(' ');puts(s1);
	for(i=1;i<=t-(b+1);i++) putchar(' ');putchar('+');puts(s2);
	for(i=1;i<=t;i++) putchar('-');puts("");
	for(i=1;i<=t-c;i++) putchar(' ');
	for(i=1;i<=c;i++) printf("%d",C[i]);puts("");
}

//减法:void Sub(int A[],int a,int B[],int b,int C[],int &c)
//参数:相减的两个数字(正数)A和B,以及位数a和b(A[1]…A[a],B[1]…B[b]),保存结果的C和结果的位数c。
//返回:无。相减的结果保存在C[]中,结果的位数保存在c中。结果为负,C[0]=-1,结果为正C[0]=1,结果为0C[0]=0。

void Sub(int A[],int a,int B[],int b,int C[],int &c)
{
	int i,j,k,flag,*p,*q;

	if(a==b)
	{
		flag=0;
		for(i=1;i<=a;i++)
		{
			if(A[i]>B[i])flag=1;
			if(A[i]<B[i])flag=-1;
			if(flag) break;
		}
	}
	if(a>b) flag=1;
	if(a<b) flag=-1;
	if(!flag)
	{
		C[0]=0,c=1;C[1]=0;
		return;
	}
	if(flag==1)
		p=A,q=B;
	else p=B,q=A,k=a,a=b,b=k;
	for(i=1;i<=a;i++) C[i]=p[i];
	for(i=a,j=b;j>=1;j--,i--)
	{
		if(C[i]>=q[j])
			C[i]-=q[j];
		else C[i]=C[i]+10-q[j],C[i-1]--;
	}
	for(;i>=1&&C[i]<0;i--) C[i]+=10,C[i-1]--;
	for(i=1;!C[i]&&i<=a;i++);
	k=i,c=a-i+1;
	for(i=1;i<=c;i++) C[i]=C[k+i-1];
	C[0]=flag;
}

void sub()
{
	int A[510],a,B[510],b,C[510],c,i;
	a=strlen(s1);
	for(i=0;i<a;i++) A[i+1]=s1[i]-'0';
	b=strlen(s2);
	for(i=0;i<b;i++) B[i+1]=s2[i]-'0';
	Sub(A,a,B,b,C,c);
	int t=max(a,max(b+1,c));
	for(i=1;i<=t-a;i++) putchar(' ');puts(s1);
	for(i=1;i<=t-(b+1);i++) putchar(' ');putchar('-');puts(s2);
	for(i=1;i<=t-max(b+1,c);i++) putchar(' ');
	for(i=1;i<=max(b+1,c);i++) putchar('-');puts("");
	for(i=1;i<=t-c;i++) putchar(' ');
	for(i=1;i<=c;i++) printf("%d",C[i]);puts("");
}


//(1)乘法:void Mul(int A[],int a,int B[],int b,int C[],int &c)
//参数:相乘的两个数字(正数)A和B,以及位数a和b(A[1]…A[a],B[1]…B[b]),保存结果的C和结果的位数c。
//返回:无。相乘的结果保存在C[]中(C[1]…C[c]),结果的位数保存在c中。
void Mul(int A[],int a,int B[],int b,int C[],int &c)
{
	int i,j,k;

	for(i=0;i<=a+b;i++) C[i]=0;
	for(i=a;i>=1;i--)
		for(j=b;j>=1;j--)
			C[i+j]+=A[i]*B[j];
	for(i=a+b;i>1;i--)C[i-1]+=C[i]/10,C[i]%=10;
	for(i=0;!C[i]&&i<=a+b;i++);
	k=i,c=a+b-i+1;
	for(i=1;i<=c;i++) C[i]=C[k+i-1];
	if(c<=0) c=1,C[1]=0;
}

int C[510][1010];

void mul()
{
	int A[510],a,B[510],b,ans[1010],x,c[510],temp,i,j,t=0,k;
	a=strlen(s1);
	for(i=0;i<a;i++) A[i+1]=s1[i]-'0';
	b=1;
	temp=strlen(s2);
	for(i=0;i<temp;i++) 
	{
		B[1]=s2[i]-'0';
		Mul(A,a,B,b,C[i],c[i]);
		t=max(t,temp-1-i+c[i]);
	}
	k=t;
	t=max(t,max(a,temp+1));
	for(i=0;i<temp;i++) B[i+1]=s2[i]-'0';
	Mul(A,a,B,temp,ans,x);
	t=max(t,x);
	for(i=1;i<=t-a;i++) putchar(' ');puts(s1);
	for(i=1;i<=t-(temp+1);i++) putchar(' ');putchar('*');puts(s2);
	if(temp==1)
	{
		for(i=1;i<=t-max(k,temp+1);i++) putchar(' ');
		for(i=1;i<=max(k,temp+1);i++) putchar('-');puts("");
	}
	else
	{
		for(i=1;i<=t-max(c[temp-1],temp+1);i++) putchar(' ');
		for(i=1;i<=max(c[temp-1],temp+1);i++) putchar('-');puts("");
	}
	for(i=temp-1;i>=0;i--)
	{
		for(j=1;j<=t-(temp-1-i+c[i]);j++) putchar(' ');
		for(j=1;j<=c[i];j++) printf("%d",C[i][j]);puts("");
	}
	if(temp>1)
	{
		for(i=1;i<=t-max(k,x);i++) putchar(' ');
		for(i=1;i<=max(k,x);i++) putchar('-');puts("");
		for(i=1;i<=t-x;i++) putchar(' ');
		for(i=1;i<=x;i++) printf("%d",ans[i]);puts("");
	}
}

int main()
{
	for(scanf("%d",&t);t--;)
	{
		scanf("%s",s);
		int i,len=strlen(s);
		for(i=0;i<len;i++) if(s[i]=='+'||s[i]=='-'||s[i]=='*') break;
		char c=s[i];
		s[i]='\0';
		strcpy(s1,s);
		strcpy(s2,s+i+1);
		if(c=='+') add();
		else if(c=='-') sub();
		else mul();
		puts("");
	}
	return 0;
}

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