大数加减乘除取模

来源:互联网 发布:sqlserver查看sa密码 编辑:程序博客网 时间:2024/05/30 04:46

#include<stdio.h>


#include<string.h>


#include<stdlib.h>


#define MAX 20000


int a1[MAX+20];


int a2[MAX+20];


char b1[MAX+20];


char b2[MAX+20];


int aresult[MAX*2+20],flag=0;


int add(char *b1,char *b2)


{


   inti,j,flag=0;


   memset(a1,0,sizeof(a1));   //将数组中所有内容置0


   memset(a2,0,sizeof(a2));


 


   intlen1=strlen(b1);


   intlen2=strlen(b2);


   j=0;                       //把字符串数组数据存入整型数组


   for(i=len1-1;i>=0;i--)


       a1[j++]=b1[i]-'0';


   j=0;


   for(i=len2-1;i>=0;i--)


       a2[j++]=b2[i]-'0';


   for(i=0;i进行运算


   {


       a1[i]+=a2[i];


       if(a1[i]>=10)          //进位


       {


           a1[i]-=10;


           a1[i+1]++;


       }


   }


   for(i=MAX;i>=0;i--)        //跳过多余的0


   {


       if(a1[i]!=0)


           flag=1;            //出现第一个非0,打开开关


       if(flag)


           printf("%d",a1[i]);


   }


   if(!flag)                  //防止结果0被跳过后什么也不输出


       printf("0");


   return0;


}


int minus(char *b1,char *b2)


{


   inti,j=0,flag=0,key=0;


   memset(a1,0,sizeof(a1));   //将数组中所有内容置0


   memset(a2,0,sizeof(a2));


   intlen1=strlen(b1);


   intlen2=strlen(b2);


   if(len1判断大小


       key=1;


   if(len1==len2)


       for(i=0;i


       {


           if(b1[i]


           {


               key=1;


               break;


           }


           elseif(b1[j]==b2[j])


               j++;


           else


               break;


       }


 


   if(!key)                           //若被减数大,正常进行


       {


           j=0;                       //把字符串数组数据存入整型数组


           for(i=len1-1;i>=0;i--)


               a1[j++]=b1[i]-'0';


           j=0;


           for(i=len2-1;i>=0;i--)


               a2[j++]=b2[i]-'0';


       }


   if(key)                            //若被除数小,交换减数、被减数位置


       {


           j=0;                       //把字符串数组数据存入整型数组


           for(i=len1-1;i>=0;i--)


               a2[j++]=b1[i]-'0';


           j=0;


           for(i=len2-1;i>=0;i--)


               a1[j++]=b2[i]-'0';


       }


 


   for(i=0;i进行运算


   {


       a1[i]-=a2[i];


       if(a1[i]<0)            //借一位


       {


           a1[i]+=10;


           a1[i+1]--;


       }


   }


   if(key)                    //如果被减数小,加负号


       printf("-");


   for(i=MAX;i>=0;i--)        //跳过多余的0


   {


       if(a1[i]!=0)


           flag=1;            //出现第一个非0,打开开关


       if(flag)


           printf("%d",a1[i]);


   }


   if(!flag)                  //防止结果0被跳过后什么也不输出


       printf("0");


   return0;


}


int add1(char *b1,char *b2)


{


   if(b1[0]=='-'&& b2[0]!='-')


       minus(b2,b1+1);


   if(b1[0]!='-'&& b2[0]=='-')


       minus(b1,b2+1);


   if(b1[0]=='-'&& b2[0]=='-')


   {


       printf("-");


       add(b1+1,b2+1);


   }


   if(b1[0]!='-'&& b2[0]!='-')


       add(b1,b2);


}


int minus1(char *b1,char *b2)


{


   if(b1[0]=='-'&& b2[0]!='-')


   {


       printf("-");


       add(b1+1,b2);


   }


   if(b1[0]!='-'&& b2[0]=='-')


       add(b1,b2+1);


   if(b1[0]=='-'&& b2[0]=='-')


       minus(b2+1,b1+1);


   if(b1[0]!='-'&& b2[0]!='-')


       minus(b1,b2);


}


int mul(char *b1,char *b2)


{


   inti,j,flag=0;


   memset(a1,0,sizeof(a1));   //将数组中所有内容置0


   memset(a2,0,sizeof(a2));


   memset(aresult,0,sizeof(aresult));


   intlen1=strlen(b1);


   intlen2=strlen(b2);


   j=0;                       //把字符串数组数据存入整型数组


   for(i=len1-1;i>=0;i--)


       a1[j++]=b1[i]-'0';


   j=0;


   for(i=len2-1;i>=0;i--)


       a2[j++]=b2[i]-'0';


   for(j=0;j将第一个数的第j位乘以第二个数的第i位放到结果的第(i+j)位上


       for(i=0;i


           aresult[i+j]+=a1[j]*a2[i];


   for(i=0;i处理进位


       if(aresult[i]>9)


       {


           aresult[i+1]+=aresult[i]/10;


           aresult[i]=aresult[i];


       }


   for(i=MAX;i>=0;i--)        //跳过多余的0


   {


       if(aresult[i]!=0)


           flag=1;            //出现第一个非0,打开开关


       if(flag)


           printf("%d",aresult[i]);


   }


   if(!flag)                  //防止结果0被跳过后什么也不输出


       printf("0");


   return0;


}


int mul1(char *b1,char*b2)


{


   if(b1[0]=='-'&& b2[0]!='-')


   {


       printf("-");


       mul(b1+1,b2);


   }


   if(b1[0]!='-'&& b2[0]=='-')


   {


       printf("-");


       mul(b1,b2+1);


   }


   if(b1[0]=='-'&& b2[0]=='-')


       mul(b1+1,b2+1);


   if(b1[0]!='-'&& b2[0]!='-')


       mul(b1,b2);


}


 


int sub(int *p,int *q,int len1,intlen2)//p[0]、q[0]为个位


{


   inti;


   if(len1先判断大小,若被除数小,直接返还-1


       return-1;


   if(len1==len2)


       for(i=len1-1;i>=0;i--)     //位数相同时,从最大位开始比较大小


       {


           if(p[i]


               return -1;


           elseif(p[i]>q[i])


               break;


       }


   for(i=0;i减法运算,p-q后的数据放入p中


   {


       p[i]-=q[i];


       if(p[i]<0)


       {


           p[i]+=10;


           p[i+1]--;


       }


   }


   for(i=len1;i>=0;i--)


   {


       if(p[i])


           returni+1;            //返回位数


   }


   return0;                      //若被除数等于除数,返回0


}


int div(char *b1,char *b2)


{


   inti,j,flag=0;


   intntime;


   intleng1=strlen(b1);


   intleng2=strlen(b2);


   ntime=leng1-leng2;


   memset(a1,0,sizeof(a1));


   memset(a2,0,sizeof(a2));


   memset(aresult,0,sizeof(aresult));


   j=0;


   for(i=leng1-1;i>=0;i--)


       a1[j++]=b1[i]-'0';


   j=0;


   for(i=leng2-1;i>=0;i--)


       a2[j++]=b2[i]-'0';


   for(i=leng1-1;i>=0;i--)        //被除数乘以十的次方,使结果和被除数长度相同


   {


       if((i-ntime)>=0)


           a2[i]=a2[i-ntime];


       else


           a2[i]=0;


   }


   leng2=leng1;                   //结果与被除数长度相同


   for(i=0;i<=ntime;i++)          //从除数*10^(ntime)开始减减到不能减,再减去除数*10^(ntime-1)…………直至不能减去除数


   {


       while((j=sub(a1,a2+i,leng1,leng2-i))>=0)//循环相减


       {


           ++aresult[ntime-i];     //每减一次,商的对应位加一


           leng1=j;


       }


   }


   for(i=MAX;i>=0;i--)        //跳过多余的0


   {


       if(aresult[i]!=0)


           flag=1;            //出现第一个非0,打开开关


       if(flag)


           printf("%d",aresult[i]);//输出结果


   }


   if(!flag)                  //防止结果0被跳过后什么也不输出


       printf("0");


   return0;


}


int div1(char *b1,char *b2)


{


   if(b1[0]=='-'&& b2[0]!='-')


   {


       printf("-");


       div(b1+1,b2);


   }


   if(b1[0]!='-' && b2[0]=='-')


   {


       printf("-");


       div(b1,b2+1);


   }


   if(b1[0]=='-'&& b2[0]=='-')


       div(b1+1,b2+1);


   if(b1[0]!='-'&& b2[0]!='-')


       div(b1,b2);


}


int mod(char *b1,char *b2)


{


   inti,j,flag=0;


   intntime;


   intleng1=strlen(b1);


   intleng2=strlen(b2);


   ntime=leng1-leng2;


   memset(a1,0,sizeof(a1));


   memset(a2,0,sizeof(a2));


   j=0;


   for(i=leng1-1;i>=0;i--)


       a1[j++]=b1[i]-'0';


   j=0;


   for(i=leng2-1;i>=0;i--)


       a2[j++]=b2[i]-'0';


   for(i=leng1-1;i>=0;i--)        //被除数乘以十的次方,使结果和被除数长度相同


   {


       if((i-ntime)>=0)


           a2[i]=a2[i-ntime];


       else


           a2[i]=0;


   }


   leng2=leng1;                   //结果与被除数长度相同


   for(i=0;i<=ntime;i++)          //从除数*10^(ntime)开始减减到不能减,再减去除数*10^(ntime-1)…………直至不能减去除数


   {


       while((j=sub(a1,a2+i,leng1,leng2-i))>=0)//循环相减,减到最后不能再减的a1就是余数


       {


           leng1=j;


       }


   }


   for(i=MAX;i>=0;i--)        //跳过多余的0


   {


       if(a1[i]!=0)


           flag=1;            //出现第一个非0,打开开关


       if(flag)


           printf("%d",a1[i]);//输出余数


   }


   if(!flag)                  //防止结果0被跳过后什么也不输出


       printf("0");


   return0;


}


int mod1(char *b1,char *b2)


{


   if(b1[0]=='-'&& b2[0]!='-')


   {


       printf("-");


       mod(b1+1,b2);


   }


   if(b1[0]!='-'&& b2[0]=='-')


 


       mod(b1,b2+1);


   if(b1[0]=='-'&& b2[0]=='-')


   {


       printf("-");


       mod(b1+1,b2+1);


   }


   if(b1[0]!='-'&& b2[0]!='-')


       mod(b1,b2);


}


 


 


int main()


{


   scanf("%s",b1);


   scanf("%s",b2);


   printf("加:");


   add1(b1,b2);


   printf("\n减:");


   minus1(b1,b2);


   printf("\n乘:");


   mul1(b1,b2);


   printf("\n除:");


   div1(b1,b2);


   printf("\n取模:");


   mod1(b1,b2);


}


                                                                                                                ----徐瑞    

0 0