/*大整数运算*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
char* add(char* a,char* b);
char* sub(char* a,char* b);
char* mul(char* a,char* b);
char* div(char* a,char* b);
bool isValid(char* a,int n);
char* add_core(char* a,char* b);
char* sub_core(char* a,char* b);
char* mul_core(char* a,char* b);
char* div_core(char* a,char* b);
int main()
{
char* a;
char* b;
a=(char*)malloc(sizeof(char)*MAX);
b=(char*)malloc(sizeof(char)*MAX);
scanf("%s",a);
scanf("%s",b);
if(isValid(a,strlen(a)) && isValid(b,strlen(b)))
{
printf("a+b=%s\n",add(a,b));
//add(a,b);
printf("a-b=%s\n",sub(a,b));
printf("a*b=%s\n",mul(a,b));
printf("a/b=%s\n",div(a,b));
}
else
{
printf("invalid input\n");
}
return 0;
}
bool isValid(char* a,int n)
{
int i;
if(a==NULL || n<=0)
return false;
if(!(a[0]=='-' || (a[0]>='0' && a[0]<='9')))
return false;
if(a[0]=='0' && a[1]!='\0')
return false;
for(i=1;i<n;i++)
if(a[i]<'0' || a[i]>'9')
return false;
return true;
}
char* add(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1>len2?len1:len2;
char* c;
c=(char*)malloc(sizeof(char)*(len+3));
if(a[0]!='-' && b[0]!='-')//a+b
{
return add_core(a,b);
}
else if(a[0]=='-' && b[0]=='-')//-a-b
{
c[0]='-';
c[1]='\0';
strcat(c,add_core(a+1,b+1));
return c;
}
else if(a[0]=='-' && b[0]!='-')//-a+b
{
return sub(b,a+1);
}
else if(a[0]!='-' && b[0]=='-')//a-b
{
return sub(a,b+1);
}
}
char* add_core(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1>len2?len1+1:len2+1;
char* c;
int i=len-1,carry=0,temp;
int index1=len1-1,index2=len2-1;
c=(char*)malloc(sizeof(char)*(len+1));
c[len]='\0';
while(index1>=0 && index2>=0)
{
temp= a[index1--]-'0' + b[index2--]-'0' + carry;
if(temp>=10)
{
carry=1;
c[i--]=temp-10+'0';
}
else
{
carry=0;
c[i--]=temp+'0';
}
}
while(index1>=0)
{
temp= a[index1--]-'0'+carry;
if(temp>=10)
{
carry=1;
c[i--]=temp-10+'0';
}
else
{
carry=0;
c[i--]=temp+'0';
}
}
while(index2>=0)
{
temp= b[index2--]-'0'+carry;
if(temp>=10)
{
carry=1;
c[i--]=temp-10+'0';
}
else
{
carry=0;
c[i--]=temp+'0';
}
}
c[i]=carry+'0';
i=0;
while(c[i]=='0')
i++;
return c+i;
}
char* sub(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1>len2?len1:len2;
char* c;
c=(char*)malloc(sizeof(char)*(len+2));
if(a[0]!='-' && b[0]!='-')//a-b
{
if(len1>len2 || (len1==len2 && strcmp(a,b)>0))
return sub_core(a,b);
else if(len1<len2 || (len1==len2 && strcmp(a,b)<0))
{
c[0]='-';
c[1]='\0';
strcat(c,sub_core(b,a));
return c;
}
else if(strcmp(a,b)==0)
{
c[0]='0';
c[1]='\0';
return c;
}
}
else if(a[0]=='-' && b[0]=='-')//-a+b
{
if(len1<len2 || (len1==len2 && strcmp(a+1,b+1)<0))
return sub_core(b+1,a+1);
else if(len1>len2 || (len1==len2 && strcmp(a+1,b+1)>0))
{
c[0]='-';
c[1]='\0';
strcat(c,sub_core(a+1,b+1));
return c;
}
else if(strcmp(a+1,b+1)==0)
{
c[0]='0';
c[1]='\0';
return c;
}
}
else if(a[0]=='-' && b[0]!='-')//-a-b
{
c[0]='-';
c[1]='\0';
strcat(c,add_core(a+1,b));
return c;
}
else if(a[0]!='-' && b[0]=='-')//a+b
{
return add_core(a,b+1);
}
}
char* sub_core(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1>len2?len1:len2;
char* c;
int index1=len1-1,index2=len2-1,index=len-1;
int temp,carry=0;
c=(char*)malloc(sizeof(char)*(len+1));
c[len]='\0';
while(index1>=0 && index2>=0)
{
temp=(a[index1--]-'0')-(b[index2--]-'0')-carry;
if(temp<0)
{
temp=10+temp;
carry=1;
c[index--]=temp+'0';
}
else
{
carry=0;
c[index--]=temp+'0';
}
}
while(index1>=0)
{
temp=(a[index1--]-'0')-carry;
if(temp<0)
{
temp=10+temp;
carry=1;
c[index--]=temp+'0';
}
else
{
carry=0;
c[index--]=temp+'0';
}
}
index=0;
while(c[index]=='0')
index++;
return c+index;
}
char* mul(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1+len2;
char* c;
c=(char*)malloc(sizeof(char)*(len+1));
if(a[0]=='-' && b[0]=='-')
{
return mul_core(a+1,b+1);
}
if(a[0]=='-' && b[0]!='-')
{
c[0]='-';
c[1]='\0';
strcat(c,mul_core(a+1,b));
return c;
}
if(a[0]!='-' && b[0]=='-')
{
c[0]='-';
c[1]='\0';
strcat(c,mul_core(a,b+1));
return c;
}
if(a[0]!='-' && b[0]!='-')
{
return mul_core(a,b);
}
}
char* mul_core(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1+len2;
char* c;
int index1,index2,index;
int temp,carry=0;
c=(char*)malloc(sizeof(char)*(len+1));
c[len]='\0';
for(index=0;index<len;index++)
c[index]='0';
for(index2=len2-1;index2>=0;index2--)
{
for(index1=len1-1;index1>=0;index1--)
{
c[index1+index2+1]=(a[index1]-'0')*(b[index2]-'0')+c[index1+index2+1];
}
}
for(index=len-1;index>=0;index--)
{
temp=c[index]-'0'+carry;
if(temp>=10)
{
carry=temp/10;
c[index]=temp%10+'0';
}
else
{
carry=0;
c[index]=temp+'0';
}
}
index=0;
while(c[index]=='0')
index++;
if(index==len)
return c+index-1;
return c+index;
}
char* div(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1-len2+2>2?len1-len2+2:2;
char* c;
char* temp1;
char* temp2;
c=(char*)malloc(sizeof(char)*(len+1));
temp1=a;
temp2=b;
if(a[0]=='-')
temp1=a+1;
if(b[0]=='-')
temp2=b+1;
c[0]='0';
c[1]='\0';
if(strlen(temp1)<strlen(temp2) || (strlen(temp1)==strlen(temp2) && strcmp(temp1,temp2)<0))
return c;
if(strcmp(b,c)==0)
return NULL;
if(a[0]=='-' && b[0]=='-')
return div_core(a+1,b+1);
if(a[0]=='-' && b[0]!='-')
{
c[0]='-';
c[1]='\0';
strcat(c,div_core(a+1,b));
return c;
}
if(a[0]!='-' && b[0]=='-')
{
c[0]='-';
c[1]='\0';
strcat(c,div_core(a,b+1));
return c;
}
if(a[0]!='-' && b[0]!='-')
{
return div_core(a,b);
}
}
char* div_core(char* a,char* b)
{
int len1=strlen(a);
int len2=strlen(b);
int len=len1-len2+2;
int div_len=0;
int index1=0;
int index=0;
char* c;
char* div;
char* pc;
c=(char*)malloc(sizeof(char)*(len+1));
div=(char*)malloc(sizeof(char)*(len2+2));
pc=(char*)malloc(sizeof(char)*(len2+1));
//div="";
for(index=0;index<len;index++)
c[index]='0';
index=0;
while(index1<len1)
{
while(div_len<len2 || (div_len==len2 && strcmp(div,b)<0))
{
//div_len=strlen(div);
div[div_len]=a[index1++];
div[div_len+1]='\0';
div_len=strlen(div);
}
while(1)
{
pc=sub_core(div,b);
if(strlen(pc)>len2 || (strlen(pc)==len2 && strcmp(pc,b)>0))
c[index]++;
else
break;
strcpy(div,pc);
}
c[index]++;
index++;
}
c[index]='\0';
return c;
}
大整数的加减乘除
最新推荐文章于 2024-04-11 22:19:01 发布