C实现大数相加(+,-通用)
输入数字a,b,c。比较a+b和c的大小,a,b,c为任意整数。比如输入1111111111111111111111111,9,199999999999999999999999999。
基本思想就是存在一个数组中,进行运算。然后比较。正数就前面加个‘+’,这样比较方便。
#include<stdio.h>
#include<string.h>
#include<math.h>
int cp;
int j;
int main()
{
int t;
scanf("%d",&t);
int tt=1;
char str1[25],str2[25],str3[25];
char str4[25],str5[25],strtt[25];
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
memset(str3,0,sizeof(str3));
memset(str4,0,sizeof(str4));
memset(str5,0,sizeof(str5));
memset(strtt,0,sizeof(strtt));
int a,b,c;//字符串的长度
while(tt<t+1)
{
/**********如果不是负数就在前面加个'+'号***********/
scanf("%s %s %s",str1,str2,str3);
if(str1[0]>='0'&&str1[0]<='9')
{
strtt[0]='+';
strcat(strtt,str1);
strcpy(str1,strtt);
memset(strtt,0,sizeof(strtt));
}
if(str2[0]>='0'&&str2[0]<='9')
{
strtt[0]='+';
strcat(strtt,str2);
strcpy(str2,strtt);
memset(strtt,0,sizeof(strtt));
}
if(str3[0]>='0'&&str3[0]<='9')
{
strtt[0]='+';
strcat(strtt,str3);
strcpy(str3,strtt);
memset(strtt,0,sizeof(strtt));
}
//printf("%s %s %s\n",str1,str2,str3);
/**********把长度长的赋值给str4,短的给str5***********/
a=strlen(str1);
b=strlen(str2);
c=strlen(str3);
if(a>=b){
strcpy(str4,str1);
strcpy(str5,str2);
}
else{
strcpy(str4,str2);
strcpy(str5,str1);
}
//printf("%s %s\n",str4,str5);
//printf("%d %d %d\n",strlen(str1),strlen(str2),strlen(str3));
cp=1;
j=strlen(str5)-1;
int strlen1=strlen(str4);
int strlen2=strlen(str5);
/**********如果str4,str5符号相同则相加***********/
if(str4[0]==str5[0])
{
for(int i=strlen1-1;i>strlen1-strlen2;i--)
{
int temp,temp1,temp2;
temp1=str4[i]-'0';
temp2=str5[j]-'0';
temp=temp1+temp2;
if(cp==-1)temp++;
if(temp>=10)
{
temp=temp%10;
str4[i]=temp+'0';
cp=-1;
}
else
{
str4[i]=temp+'0';
cp=1;
}
j--;
}
// printf("%s\n",str4);
if(cp==-1)
{
for(int i=strlen(str4)-strlen(str5);i>0;i--)
{
int temp3=str4[i]-'0';
if(cp==-1)temp3=temp3+1;
if(temp3>=10)cp=-1;
else cp=1;
temp3=temp3%10;
str4[i]=temp3+'0';
}
}
// printf("%s\n",str4);
if(cp==-1)
{
strtt[0]='1';
strcat(strtt,str4);
strcpy(str4,strtt);
char change=str4[0];
str4[0]=str4[1];
str4[1]=change;
memset(strtt,0,sizeof(strtt));
}
// printf("相加后的数:");
// printf("%s\n",str4);
}
/**********如果str4,str5符号不同则相减***********/
if(str4[0]!=str5[0])
{
if(strlen1==2&&strlen2==2){
int faker=str4[1]-'0';
int faker1=str5[1]-'0';
if(faker>=faker1){faker=fabs(faker-faker1);str4[1]=faker+'0';}
else {
str4[0]=str5[0];
faker=fabs(faker-faker1);str4[1]=faker+'0';
}
}
else{
//同位判断绝对值大小,大的减小的
if(strlen(str4)==strlen(str5))
{
int yy=strlen(str4);
for(int iii=1;iii<yy;iii++)
{
if(str4[iii]<str5[iii])
{
char op[25];
memset(op,0,sizeof(op));
strcpy(op,str4);
strcpy(str4,str5);
strcpy(str5,op);
break;
}
}
}
for(int i=strlen1-1;i>strlen1-strlen2;i--)
{
int temp,temp1,temp2;
temp1=str4[i]-'0';
temp2=str5[j]-'0';
temp=temp1-temp2;
if(cp==-1)temp--;
if(temp<0)
{
temp=10+temp;
str4[i]=temp+'0';
cp=-1;
}
else
{
str4[i]=temp+'0';
cp=1;
}
j--;
}
// printf("%s\n",str4);
if(cp==-1)
{
for(int i=strlen(str4)-strlen(str5);i>0;i--)
{
int temp3=str4[i]-'0';
if(cp==-1)temp3=temp3-1;
if(temp3<0){cp=-1;temp3=temp3+10;}
else cp=1;
str4[i]=temp3+'0';
}
}
}
}
/**********去符号后的0,比如-999+999得到-000变为+0***********/
int kk=strlen(str4);
int ii=1;
while(str4[ii]=='0'&&str4[ii+1]!='\0')
{
char change3=str4[0];
str4[0]=str4[ii];
str4[ii]=change3;
int kk=strlen(str4);
char ss[20];
memset(ss,0,sizeof(ss));
for(int m=0;m<kk-1;m++)
ss[m]=str4[m+1];
strcpy(str4,ss);
}
//printf("%s\n",str4);
/**********将str4与str3进行比较 **********/
if(str4[0]=='+'&&str3[0]=='-')
{
printf("Case #%d: true\n",tt++);
}
if(str4[0]=='-'&&str3[0]=='+')
{
printf("Case #%d: false\n",tt++);
}
if(str4[0]==str3[0])
{
if(str4[0]=='+')
{
if(strlen(str4)>strlen(str3))printf("Case #%d: true\n",tt++);
else if(strlen(str4)<strlen(str3)) printf("Case #%d: false\n",tt++);
else{
int h;
for(h=0;h<strlen(str4);h++)
{
int temp6=str4[h]-'0';
int temp7=str3[h]-'0';
if(temp6>temp7){printf("Case #%d: true\n",tt++);break;}
else if(temp6<temp7){printf("Case #%d: false\n",tt++);break;}
}
if(h>=strlen(str4))printf("Case #%d: false\n",tt++);
}
}
else
{
if(strlen(str4)>strlen(str3))printf("Case #%d: false\n",tt++);
else if(strlen(str4)<strlen(str3)) printf("Case #%d: true\n",tt++);
else{
int h;
for(h=0;h<strlen(str4);h++)
{
int temp6=str4[h]-'0';
int temp7=str3[h]-'0';
if(temp6>temp7){printf("Case #%d: false\n",tt++);break;}
else if(temp6<temp7){printf("Case #%d: true\n",tt++);break;}
}
if(h>=strlen(str4))printf("Case #%d: false\n",tt++);
}
}
}
}
return 0;
}