大数加法
大数减法
大数乘法
大数除法
原理在代码的注释里。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Compare(char A[],char B[]) //编写函数比较两个大数大小。
//A>B返回1,A=B返回0,A<B返回-1.
{
int h1=strlen(A),h2=strlen(B);
if(h1>h2) return 1;
if(h1<h2) return -1;
for(int i=0;i<=h1-1;){
if(A[i]==B[i]) i++;
else if(A[i]>B[i]) return 1;
else return -1;
}
return 0;
}
void Add(char A[],char B[],char C[])//实现两个大数相加
{
int h1=strlen(A),h2=strlen(B),k,l;
char A1[100];//定义一个新的字符数组,存储A表示的大数。
strcpy(A1,A);
k=h1>h2?h1-1:h2-1;//记录最长的数的长度
l=h1>h2?(h1-h2):(h2-h1);//记录两个数位数差
int t2=h2-1; //记录B的位数,便于之后历数B的各个位
if(Compare(A1,B)>=0){//如果A>=B执行下面语句
for(;k>=l;k--){
C[k]=(A1[k]-'0')+(B[t2]-'0')+'0';//按位相加
t2--;
if(C[k]>'9'){//考虑进位,如果超过九则减去10,把进的1加到A1表示的大数上,这样就不用存储进的1
C[k]=C[k]-10;
for(int i=k-1;i>=0;){
if(A1[i]<'9'){
A1[i]++;
break;
}
A1[i]='0';
i--;
}
}
}
if(l>0)//A的位数大于B 由上直接继承A的前几位
for(;k>=0;k--)
C[k]=A1[k];
if(A1[0]=='0'||(l==0&&((A1[0]-'0'+B[0])>'9'))){//A的第一位等于零 说明C的第一位为10
for(k=h1-1;k>=0;k--){//A的第一位不为零但是A[0]+B[0]>9 也说明C的第一位大于9
C[k+1]=C[k];
}
C[0]='1';
}
}
else Add(B,A,C);//以上是A>=B的情况A<B则递归调用自身
}
void Min(char A[],char B[],char C[])//大数减法
{
int h1=strlen(A),h2=strlen(B),l,k,i;
char A1[100];
strcpy(A1,A);
k=h1>h2?h1-1:h2-1;
l=h1>h2?(h1-h2):(h2-h1);
int t2=h2-1;
if(Compare(A1,B)==0){//剔除A=B的情况
C[0]='0';
return;
}
if(Compare(A1,B)>0){//A>B执行下面语句
for(;k>=l;k--){//各位依次相减
C[k]=(A1[k]-'0')-(B[t2--]-'0')+'0';
if(C[k]<'0') {//小于0借1 加10
C[k]=C[k]+10;
for(i=k-1;i>=0;){//循环,A[0]不可能为0
if(A1[i]!='0'){A1[i]--;break;}
A1[i]='9';
i--;
}
}
}
if(l>0)//A的位数大于B,C继承A的前几位
for(;k>=0;k--)
C[k]=A1[k];
int cnt=0;//除去C前几位可能出现的0
for(;cnt<=h1-1;cnt++){
if(C[cnt]!='0')break;
}
for(i=0;cnt<=h1-1;){
C[i++]=C[cnt++];
}
C[i]=0;
}
else Min(B,A,C);//以上是A>=B的情况A<B则递归调用自身
}
void Mul(char A[],char B[],char C[])//大数乘法,遍历B的位数n,对B的各位*A*10^i求和。
{
int h=strlen(B),i,t;
for(i=h-1;i>=0;i--){
for(t=B[i]-'0';t>=1;t--){
Add(A,C,C);
}
strcat(A,"0");
}
}
void Div(char A[],char B[],char C[])//大数除法
{
char A1[100]={0},B1[100]={0};//避免修改原数,定义新的字符数组存储两个大数
strcpy(A1,A);
strcpy(B1,B);
int cnt,k=0,i=0,h1=strlen(A)-1,h2=strlen(B)-1;
if(Compare(A1,B1)<0){//剔除A小于B的情况
C[0]='0';
return;
}
if(Compare(A1,B1)==0){//剔除A=B的情况
C[0]='1';
return;
}
while(h1!=h2){//通过B*10^k使B的位数和A的位数一样,记录k,商总共k+1位
B1[++h2]='0';
k++;
}
while(i<=k){//商的个位求解完即结束循环
for(cnt=0;Compare(A1,B1)>=0;){
Min(A1,B1,A1);
cnt++;
}
C[i++]=cnt+'0';
B1[h2--]=0;
}
if(C[0]==0){//除去C前面可能出现的0。
for(k=1;k<=h1;k++)
C[k-1]=C[k];
}
}
int main()
{
char A[100]={0},B[100]={0},C[100]={0};
scanf("%s",A);
scanf("%s",B);
Add(A,B,C);
printf("A+B=");
puts(C);
printf("\n");
strcpy(C,"\0");
Min(A,B,C);
printf("A-B=");
puts(C);
printf("\n");
strcpy(C,"\0");
Mul(A,B,C);
printf("A*B=");
puts(C);
printf("\n");
strcpy(C,"\0");
Div(A,B,C);
printf("A/B=");
puts(C);
return 0;
}