📄 bigsum.c
字号:
#include<stdio.h>
char ch;
int i;
int main()
{
int array1[50],array2[50],answer[50],temp[50];
char flag,select,buffer;
do
{
printf("\n\n\t*******************大整数运算**********************");
printf("\n\n\t\t请选择你想要进行的运算:\n\n\t\t\t1.加法(+)\n\t\t\t2.减法(-)\n\t\t\t3.乘法(*)\n\t\t\t4.除法(\\)\n\n\t\t\t输入你的选择:");
select=getchar();
buffer=getchar();
printf("\n请输入第一个数:");
input(array1);
printf("\n请输入第二个数:");
input(array2);
printf("\n得到的式子为:\n");
printf("\t ");
switch(select)
{
case '1': plusdo(array1,array2,answer);output(array1);printf("+");output(array2);break;
case '2': subdo(array1,array2,answer);output(array1);printf("-");output(array2);break;
case '3': multdo(array1,array2,answer);output(array1);printf("*");output(array2);break;
case '4': divedo(array1,array2,answer,temp);output(array1);printf("/");output(array2);break;
}
delzero(answer);
printf("=");
output(answer);
printf("\n\n\t\t要不要继续?Y/N");
flag=getchar();
buffer=getchar();
if(flag=='n'||flag=='N')
break;
}while(1);
}
//-----------输入整型数组------------
input(int *a)
{
i=1;
ch=getchar();
if(ch=='-')
a[0]=1;
else
{
a[0]=0;
a[1]=ch-48;
i=2;
}
do
{
ch=getchar();
a[i]=ch-48;
i++;
}while(ch!='\n');
a[i-1]=10;
}
//-----------输出整型数组------------
output(int *b)
{
if(b[1]==10)
return printf("0");
if(b[0]==1)
printf("-");
for(i=1;i<50;i++)
{
if(b[i]==10)
break;
else
printf("%d",b[i]);
}
}
//------------加法-----------------
plus(int *plus1,int *plus2,int *answer)
{
int cf=0;
int p1,p2,p3;
for(p1=0;p1<50;p1++)
{
if(plus1[p1]==10)
break;
}
for(p2=0;p2<50;p2++)
{
if(plus2[p2]==10)
break;
}
p3=(p1>p2?p1:p2);
answer[p3+1]=10;
p1--;p2--;
while(p1>0&&p2>0)
{
answer[p3]=plus1[p1]+plus2[p2]+cf;
cf=0;
if(answer[p3]>=10)
{
answer[p3]=answer[p3]%10;
cf=1;
}
p1--;
p2--;
p3--;
}
while(p1==0&&p2!=0)
{
answer[p3]=plus2[p2];
p3--;
p2--;
}
while(p2==0&&p1!=0)
{
answer[p3]=plus1[p1];
p3--;
p1--;
}
if(cf==1)
{answer[p3]=cf;}
else
answer[p3]=0;
}
//-------------减法------------
sub(int *sub1,int *sub2,int *answer)
{
int cf=0;
int p1,p2,p3;
int *p;
while(!compare(sub1,sub2))
{p=sub1;sub1=sub2;sub2=p;answer[0]=1;}
for(p1=0;p1<50;p1++)
{
if(sub1[p1]==10)
break;
}
for(p2=0;p2<50;p2++)
{
if(sub2[p2]==10)
break;
}
p3=(p1>p2?p1:p2);
answer[p3]=10;
p1--;p2--;p3--;
while(p1>0&&p2>0)
{
answer[p3]=sub1[p1]-sub2[p2]-cf;
cf=0;
if(answer[p3]<0)
{
answer[p3]=answer[p3]+10;
cf=1;
}
p1--;
p2--;
p3--;
}
while(p2==0&&p1!=0)
{
if(cf==0)
answer[p3]=sub1[p1];
else
{
answer[p3]=sub1[p1]-cf;
if(answer[p3]<0)
answer[p3]=answer[p3]+10;
else
cf=0;
}
p3--;
p1--;
}
}
//------------乘法-----------
mult(int *mult1,int *mult2,int *answer)
{
int cf=0;
int p1,p2,p3;
int flag,sign;
for(p1=0;p1<50;p1++)
{
if(mult1[p1]==10)
break;
}
for(p2=0;p2<50;p2++)
{
if(mult2[p2]==10)
break;
}
p1--;p2--;
p3=p1+p2;
answer[p3+1]=10;
flag=p1;
for(sign=p3;p3>0;p3--)
answer[p3]=0;
for(p3=sign;p2>0;p2--)
{
for(p1=flag;p1>0;p1--,p3--)
{
answer[p3]=answer[p3]+mult1[p1]*mult2[p2]+cf;
cf=0;
if(answer[p3]>=10)
{
cf=answer[p3]/10;
answer[p3]=answer[p3]%10;
}
}
if(cf!=0)
{
answer[p3]=cf;
cf=0;
}
p1=flag;
p3=--sign;
}
}
//----------------除法------------------------
dive(int *dive1,int *dive2,int *answer,int *temp)
{
int p1,p2,p3=1;
for(i=0;i<50;i++)
answer[i]=0;
for(p2=0;p2<50;p2++)
{
if(dive2[p2]==10)
break;
}
p2--;p1=p2;
temp[p1+1]=10;
while(p1>0)
{
temp[p1]=dive1[p1];
p1--;
}
p1=p2;
while(dive1[p1]!=10)
{
while(compare(temp,dive2))
{
sub(temp,dive2,temp);
delzero(temp);
answer[p3]++;
}
p3++;p1++;
add(temp,dive1[p1]);
}
answer[p3]=10;
}
//----------比较两数大小-------
int compare(int *com1,int *com2)
{
int i=1,j=1;
while(com1[i]!=10)
i++;
while(com2[j]!=10)
j++;
i--;j--;
if(i<j)
return 0;
else if(i>j)
return 1;
else
{
for(i=1;i<=j;i++)
{
if(com1[i]<com2[i])
return 0;
else if(com1[i]>com2[i])
return 1;
else
continue;
}
}
return 1;
}
//-----------加数移入temp------
add(int *temp,int addnum)
{
int i=1;
while(temp[i]!=10)
i++;
temp[i]=addnum;
temp[++i]=10;
}
//----------去前面的0-------------
delzero(int *del)
{
int flag=0,num=0;
int i,j;
for(i=1;del[i]<10;i++)
{
if(del[i]==0&&flag==0)
num++;
else
flag=1;
}
if(num!=0)
{
for(j=1;(j+num)<=i;j++)
del[j]=del[j+num];
}
}
//------------最终加法-----
plusdo(int *array1,int *array2,int *answer)
{
int flag=0;
if(array1[0]==1)
array1[0]=2;
flag=array1[0]+array2[0];
switch(flag)
{
case 0 : plus(array1,array2,answer);break;
case 1 : sub(array1,array2,answer);break;
case 2 : sub(array2,array1,answer);break;
case 3 : plus(array1,array2,answer);answer[0]=1;break;
}
}
//-----------最终减法-----------
subdo(int *array1,int *array2,int *answer)
{
int flag=0;
if(array1[0]==1)
array1[0]=2;
flag=array1[0]+array2[0];
switch(flag)
{
case 0 : sub(array1,array2,answer);break;
case 1 : plus(array1,array2,answer);break;
case 2 : plus(array1,array2,answer);answer[0]=1;break;
case 3 : sub(array2,array1,answer);break;
}
}
//-----------最终乘法-----------
multdo(int *array1,int *array2,int *answer)
{
int flag=0;
flag=array1[0]+array2[0];
switch(flag)
{
case 0 : mult(array1,array2,answer);break;
case 1 : mult(array1,array2,answer);answer[0]=1;break;
case 2 : mult(array1,array2,answer);break;
}
}
//-----------最终除法-----------
divedo(int *array1,int *array2,int *answer,int *temp)
{
int flag=0;
flag=array1[0]+array2[0];
switch(flag)
{
case 0 : dive(array1,array2,answer,temp);break;
case 1 : dive(array1,array2,answer,temp);answer[0]=1;break;
case 2 : dive(array1,array2,answer,temp);break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -