大数相加:
/*大数相加*/
#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;
}