在同一个程序中实现大整数的+ _ * /运算(200位以内)
#include<stdio.h>
#include<string.h>
#define ML 220 //宏定义,定义数组的长度
char s1[ML]; //定义全局变量
char s2[ML];
int a[ML];
int b[ML];
//----------------------------加-------------------------------------//
int ADD(int *p1,int *p2,int l1,int l2){
int add[ML],i,j;
memset(add,0,sizeof(add)); //对add数组进行初始赋值0
int a=l1;
if(l1<l2) a=l2;
for(i=a-1,j=0;i>=0;i--){ //从两个数的个位开始相加,之和存入add数组中,从个位开始
add[j]=add[j]+p1[i]+p2[i];
if(add[j]>=10){ //如果该位两数字相加大于10,则add相应位减10,下一位加1
add[j]-=10;
add[j+1]++;
}
j++;
}
if(add[j]) printf("%d",add[j]); //判断两数和的第j位(即最高位)是否为0,为0不输出,否则,输出
for(;j>0;j--)
printf("%d",add[j-1]); //从最高位往低位输出结果
printf("\n");
}
//----------------------------减-------------------------------------//
int SUB(int *p1,int *p2,int l1,int l2){
int sub[ML],i,j;
memset(sub,0,sizeof(sub)); //对sub数组进行初始赋值0
if(l2>l1){ //判断减数与被减数的位数大小,若被减数位数小于减数,则先按照长数组减短数组计算,即先计算减数减去被减数
for(i=l2-1,j=0;i>=0;i--,j++){
sub[j]=sub[j]+p2[i]-p1[i];
if(sub[j]<0){ //若该位不够减,即此数小于0,则向高一位借1
sub[j]+=10;
sub[j+1]--;
}
}
}
else {
for(i=l1-1,j=0;i>=0;i--,j++){
sub[j]=sub[j]+p1[i]-p2[i];
if(sub[j]<0){
if(i){ //判断i是否为0,若为0,则sub[j]小于0时不向高位借1,否则借1
sub[j]+=10;
sub[j+1]--;
}
}
}
}
if(l2>l1) printf("-"); //若被减数的位数比减数的小,则输出负号(-)
if(sub[j]) printf("%d",sub[j]); //判断sub[j]是否为0,为0不输出,否则,输出
for(;j>0;j--)
printf("%d",sub[j-1]); //从高位往低位输出结果
printf("\n");
}
//----------------------------乘-------------------------------------//
int MUL(int *p1,int *p2,int l1,int l2){
int mul[ML*2],i,j,k;
memset(mul,0,sizeof(mul)); //对mul数组进行初始赋值0
for(i=l2-1;i>=0;i--){ //先对每一位上的数字进行乘法运算,存入相应的位置
for(j=l1-1,k=l2-i-1;j>=0;j--,k++){
mul[k]=mul[k]+p1[j]*p2[i];
}
}
for(i=0;i<k;i++){ //对乘法运算过后的数组逐位处理进位
if(mul[i]>=10){
mul[i+1]+=mul[i]/10;
mul[i]%=10;
}
}
if(mul[k]) printf("%d",mul[k]); //判断mul[k]是否为0,为0不输出,否则,输出
for(;k>0;k--)
printf("%d",mul[k-1]); //从高位往低位输出结果
printf("\n");
}
//----------------------------除-------------------------------------//
int DIV(int *p1,int *p2,int l1,int l2){
int div[ML],i,j,k;
memset(div,0,sizeof(div)); //对div数组进行初始赋值0
int x=0;
for(i=0;i<l2;i++){ //统计除数中0的个数
if(p2[i]==0)
x++;
}
if(x==l2) printf("Your input is wrong!\n"); //若除数中0的个数与除数的长度相等,即除数为0,输出提示”输入有误“
else if(l1>l2){ //判断除数与被除数的位数大小,若被除数位数大,则累减求商
int ntime=l1-l2; //判断除数与被除数的位数差,也即是商的位数-1
for(i=l1-1;i>=ntime;i--) //将除数的位数扩大至与被除数的位数相同,即,在除数尾部添加0至与被除数位数相等
p2[i]=p2[i-ntime];
for(;i>=0;i--)
p2[i]=0;
for(i=0;i<=ntime;i++){
while(1){ //求商,也即是采用累减的方法计算商的每一位数字
for(j=l1-i-1,k=l1-1;j>=0&&k>=i;j--,k--){
p1[j]-=p2[k];
if(p1[j]<0){
if(j){
p1[j]+=10;
p1[j-1]--;
}
}
}
if(p1[0]>=0) div[i]++; //若被除数的最高位大于等于0,则该位的商+1
else break; //累减至被除数的最高位小于0,得出每一位的商的数
}
}
for(i=ntime;i>=0;i--) if(div[i]) break; //过滤0
for(;i>=0;i--) printf("%d",div[i]); //输出商
// for(i=0;i<=ntime;i++) //从高位往低位输出结果
// printf("%d",div[i]); 输出相反了。。。。。。
printf("\n");
}
else if(l1==l2&&p1[0]>=p2[0]){ //若除数与被除数位数相等,且被除数的最高位大于等于除数的,再次利用累减方法求商
int m=0; //除数与被除数位数相等,则其商是个一位数
while(1){
for(j=l1-1,k=l2-1;j>=0&&k>=0;j--,k--){
p1[j]-=p2[k];
if(p1[j]<0){
if(j){
p1[j]+=10;
p1[j-1]--;
}
}
}
if(p1[0]>=0) m++;
else break;
}
printf("%d\n",m); //输出商
}
else printf("0\n"); //若除数位数大于被除数位数,或,其位数相等且除数最高位小于被除数的,则输出0
}
//--------------------------主函数-----------------------------------//
int main()
{
int i,j,k;
char s;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s %c %s",s1,&s,s2);
int l1=strlen(s1);
for(i=l1-1,j=l1-1;i>=0;i--) //将字符串s1内的数字字符转化成数字存入a数组中
a[j--]=s1[i]-'0';
int l2=strlen(s2);
for(i=l2-1,j=l2-1;i>=0;i--) //将字符串s2内的数字字符转化成数字存入b数组中
b[j--]=s2[i]-'0';
switch(s){ //判断需要进行的运算:’+‘、’-‘,’*‘,’/‘?
case '+':ADD(a,b,l1,l2);break;
case '-':SUB(a,b,l1,l2);break;
case '*':MUL(a,b,l1,l2);break;
case '/':DIV(a,b,l1,l2);break;
}
return 0;
}