大数取模 c语言,大数加减乘除取模最终版

#include

#include

#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)

{

int

i,j,flag=0;

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

//将数组中所有内容置0

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

int

len1=strlen(b1);

int

len2=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");

return

0;

}

int minus(char *b1,char *b2)

{

int

i,j=0,flag=0,key=0;

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

//将数组中所有内容置0

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

int

len1=strlen(b1);

int

len2=strlen(b2);

if(len1判断大小

key=1;

if(len1==len2)

for(i=0;i

{

if(b1[i]

{

key=1;

break;

}

else

if(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");

return

0;

}

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)

{

int

i,j,flag=0;

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

//将数组中所有内容置0

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

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

int

len1=strlen(b1);

int

len2=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");

return

0;

}

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,int

len2)//p[0]、q[0]为个位

{

int

i;

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

return

-1;

if(len1==len2)

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

//位数相同时,从最大位开始比较大小

{

if(p[i]

return -1;

else

if(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])

return

i+1;

//返回位数

}

return

0;

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

}

int div(char *b1,char *b2)

{

int

i,j,flag=0;

int

ntime;

int

leng1=strlen(b1);

int

leng2=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");

return

0;

}

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)

{

int

i,j,flag=0;

int

ntime;

int

leng1=strlen(b1);

int

leng2=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");

return

0;

}

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值