龙空技术网

C语言实现超大数除法及超大数加减乘除算法的不同

滴水穿石hgn 189

前言:

现在姐妹们对“c语言两个数的除法”都比较着重,兄弟们都想要学习一些“c语言两个数的除法”的相关文章。那么小编同时在网络上汇集了一些有关“c语言两个数的除法””的相关文章,希望大家能喜欢,姐妹们快快来学习一下吧!

一、超大数除法的关键是怎样试商?怎样判断是否除完了?为了减少运算次数,有意让试商稍微小一点,最后一次性判断是否除完了。程序如下:

二、程序:

//超大数除法(超大数:是指超过计算机处理范围的非负整数)

#include <stdio.h>

#include <string.h>

#define N 100 //常数N应大于数据的最大位数

int main ()

{ char bc[N],cc[N]; //定义字符串数组:被除数串bc,除数串cc

int b[N]={},c[N]={},s[N]={},y[N*2]={}; //整数数组:被除数b,除数c,商s,余数y

int lb,lc,l,x,i,k; //被除数长lb,除数长lc,商长度l,循环变量x,i,k

int ss,jw,xj; //试商ss,进位jw,新积xj

//一) 输入:

printf("请连续输入被除数:");gets(bc);

printf("请连续输入除数:");gets(cc);

//二) 转换:

lb=strlen(bc);lc=strlen(cc); //测长

for(x=1;x<=lb;x++){y[x]=bc[lb-x]-48;} /*被除数字符串转换成整数*/

for(x=1;x<=lc;x++){c[x]=cc[lc-x]-48;} /*除数字符串转换成整数*/

//三) 运算:

for(i=lb;i>=lc;i--) //A.定首位(从高位起除):

{ y[i] +=y[i+1]*10;y[i+1]=0; //上次余数合并到本次

s[i]=0;

while(y[i]>c[lc]) //B.相除(够除才除)

{ ss=(y[i]*10+y[i-1])/(c[lc]*10+c[lc-1]+1); //1.试商ss(一次看两位,+1为防商过大)

if(ss==0)ss=1; //因被除数大于除数,故至少商1

jw=0;s[i]+=ss; //进位jw置0,累加商s

for(k=1;k<=lc-1;k++) //2.核心运算(从低位到高位):

{ xj=c[k]*ss+jw; //求新积

if(xj>=10){jw=xj/10;xj%=10;} else jw=0; //求积的进位及本位

l=k+i-lc; //定位:通过l把k与i联系起来

if(y[l]<xj) {y[l]+=10;y[l+1]--;} //借1当10

y[l]-=xj; //相减

}

xj=c[lc]*ss+jw;

y[i]-=xj; //最高位相减

}

}

while(y[lc]>=c[lc]) //C.后续处理:

{ for(x=lc;x>=1;x--) //a.逐位比较余数与除数:

{ if(y[x]>c[x])break; //1.遇到大的,退出内循环:去减一遍

if(y[x]<c[x]){goto tc;} //2.遇到小的(说明除完了),退出外循环

}

s[lc]++; //b.再减一遍(商加1)

for(x=1;x<=lc;x++) //没有中途跳转,说明余数 >= 除数,再减一遍

{ if(y[x]<c[x]){y[x]+=10;y[x+1]--;} //借位

y[x]-=c[x]; //相减

}

}tc:

for(x=lc;x<=lb-1;x++) //D.处理商进位:

{ s[x+1]+=s[x]/10; //求进位

s[x]%=10; //求本位

}

if(s[lb]==0) lb--; //处理商首位的0:

//四) 输出:

printf("%s/%s=",bc,cc); //1.输出商:

for(x=lb;x>=lc;x--)

{ if((x-lc+1)%3==0&&x!=lb)printf(","); //每3位加一个","

printf("%d",s[x]); //逐位输出商

}

printf("余数为:"); //2.输出余数:

for(x=lc;x>=1;x--)

{ if(y[x]!=0||x==1) {lc=x;break;} //截掉余数前面的0

}

for(x=lc;x>=1;x--)

{ if(x%3==0&&x!=lc) printf(","); //每3位加一个","

printf("%d",y[x]); //2).逐位输出余数

}

}

三、不同点:

超大数加、减、乘、除算法的不同主要表现在:结果保存、运算顺序、对齐方式、进位方式四个方面,具体是:

1 结果保存不同:加减法的运算结果直接保存在被算数(被加数或被减数)数组b[]中;而乘法的结果需要新增一个积数组j[]保存;除法用数组s[]保存商,用数组y[]保存余数。

2 运算顺序不同:加、减、乘都采用由低位到高位的顺序进行运算,而除法采用由高位到低位的顺序进行运算。

3 对齐方式不同:加减法对齐方式是固定的,所以只用一重循环就能完成运算,而乘除法对齐方式是移位往复式的,所以乘法运算需要两重循环,除法就更复杂了。

4 进位方式不同:加法的进位是显式的只需要一个变量jw即可(减法不够减时需要退位),乘法的进位隐含在积数组j[]中;除法中的进位也是显式的(商与除数相乘时需要进位)。

标签: #c语言两个数的除法 #c语言两个数的除法怎么算 #c语言两个数的除法怎么表示