大数运算

大数相加:

/*大数相加*/

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

void Move2Right(char str[],int StrEnd,int StrDest)
{
	int i,dist;
	dist=StrDest-StrEnd;
	for(i=StrEnd;i>=0;i--)
	{
	  str[i+dist]=str[i];
	}
	for(i=0;i<dist;i++)
		str[i]='0';
}


int AddTwoNum(char str1[],char str2[],int result[],int StrLen)
{
  int i,carry,temp;
  carry=0;
  for(i=StrLen-1;i>=0;i--)
  {
     temp=(str1[i]-48)+(str2[i]-48)+carry;
     result[i]=temp%10;
	 carry=temp/10;
  }
  return carry;
}

int BigNumAdd(char str1[],char str2[],int result[],int Str1Len,int Str2Len)
{
  if(Str1Len>Str2Len)
  {
     Move2Right(str2,Str2Len-1,Str1Len-1);
	 return AddTwoNum(str1,str2,result,Str1Len);
  }
  else if(Str1Len<Str2Len)
  {
     Move2Right(str1,Str1Len-1,Str2Len-1);
	 return AddTwoNum(str1,str2,result,Str2Len);
  }
  else 
	  return AddTwoNum(str1,str2,result,Str1Len);
}

void PrintArray(int result[],int len)
{
   int i;
   for(i=0;i<len;i++)
	   printf("%d",result[i]);
   printf("\n");
}
int main()
{
	char str1[1000],str2[1000];
	int result[1000],carry,len1,len2,len;
    while(scanf("%s",str1)&&scanf("%s",str2))
	{  
		memset(result,0,sizeof(int)*1000);
		len1=strlen(str1);
		len2=strlen(str2);
		len=len1>=len2 ? len1 : len2;
		carry=BigNumAdd(str1,str2,result,len1,len2);
		if(carry>0) printf("%d",carry);
		PrintArray(result,len);
	}
	return 1;
}

大数相减:

/*大数相减*/

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

bool Compare(char str1[],char str2[],int StrLen)
{ 
	bool GreaterOrEqual=true;
	int i;
	for(i=0;i<StrLen;i++)
	{
		if(str1[i]<str2[i])
		{
			GreaterOrEqual=false;
			break;
		}
	}
	return GreaterOrEqual;
}

void Move2Right(char str[],int StrEnd,int StrDest)
{
	int i,dist;
	dist=StrDest-StrEnd;
	for(i=StrEnd;i>=0;i--)
	{
	  str[i+dist]=str[i];
	}
	for(i=0;i<dist;i++)
		str[i]='0';
}


void SubtractTwoNum(char str1[],char str2[],int result[],int StrLen)
{
  int i,carry,temp;
  carry=0;
  for(i=StrLen-1;i>=0;i--)
  {
	 if(str1[i]>=str2[i])
	 {
        temp=(str1[i]-48)-(str2[i]-48);
	 }
	 else
	 {
		 str1[i-1]=str1[i-1]-1;
		 temp=10+(str1[i]-48)-(str2[i]-48);
	 }
     result[i]=temp;
  }
}

int BigNumSubtract(char str1[],char str2[],int result[],int Str1Len,int Str2Len)
{
  bool GreaterOrEqual=true;
  if(Str1Len>Str2Len)
  {
     Move2Right(str2,Str2Len-1,Str1Len-1);
	 SubtractTwoNum(str1,str2,result,Str1Len);
	 return 1;
  }
  else if(Str1Len<Str2Len)
  {
     Move2Right(str1,Str1Len-1,Str2Len-1);
	 SubtractTwoNum(str1,str2,result,Str2Len);
	 return -1;
  }
  else 
  {   
      GreaterOrEqual=Compare(str1,str2,Str1Len);
	  if(GreaterOrEqual)
	  {
	      SubtractTwoNum(str1,str2,result,Str1Len);
	      return 1;
	  }
	  else
	  {
		  SubtractTwoNum(str2,str1,result,Str1Len);
		  return -1;
	  }
  }
}

void PrintArray(int result[],int len,int signal)
{
   int i;
   for(i=0;i<len;i++)
	   if(result[i]!=0) break;
   if(signal<0) printf("-");
   for(;i<len;i++)
	   printf("%d",result[i]);
   printf("\n");
}

int main()
{
	char str1[1000],str2[1000];
	int result[1000],len1,len2,len,signal;
    while(scanf("%s",str1)&&scanf("%s",str2))
	{  
		memset(result,0,sizeof(int)*1000);
		len1=strlen(str1);
		len2=strlen(str2);
		len=len1>=len2 ? len1 : len2;
		signal=BigNumSubtract(str1,str2,result,len1,len2);
		PrintArray(result,len,signal);
	}
	return 1;
}

大数相乘:

/*大数相乘*/

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


void MultiplyTwoNum(char str1[],char str2[],int result[],int len1,int len2,int &ResultSize,int &carry)
{  
   int i,j,k,temp;
   for(i=len1-1;i>=0;i--)
   {   
	   carry=0;
       k=len1-1-i;
	   for(j=len2-1;j>=0;j--)
	   {
          temp=(str1[i]-48)*(str2[j]-48)+result[k]+carry;
		  result[k++]=temp%10;
		  carry=temp/10;
	   }
   }
   ResultSize=k;
		   
}

void ReversePrintArray(int result[],int len,int &carry)
{
   int i;
   if(carry>0) printf("%d",carry);
   for(i=len-1;i>=0;i--)
	   printf("%d",result[i]);
   printf("\n");
}

int main()
{
	char str1[100],str2[100];
	int result[1000],carry,len1,len2,ResultSize;
    while(scanf("%s%s",str1,str2)!=EOF)
	{  
		memset(result,0,sizeof(int)*1000);
		len1=strlen(str1);
		len2=strlen(str2);
		MultiplyTwoNum(str1,str2,result,len1,len2,ResultSize,carry);
		ReversePrintArray(result,ResultSize,carry);
	}
	return 1;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值