超大数除法4

一、运行结果展示:

c语言编程一个任意的10个数的数组(C语言超大数除法4)(1)

二、特点:

1 用数组的1个单元存储4位整数

2 输出时从个位向前每4位加一个“ ’ ”,便于中文的“个 十 百 千 万,十万 百位 千万 亿,十亿 百亿 千亿 万亿……读数”。

三、C语言编程如下:

#include <stdio.h> /*包含输入输出函数*/

#include <string.h> /*包含字符串处理函数*/

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

main ()

{ char zfc[N*4]; //字符串zfc

int c[N]={},s[N]={},y[N*2]={},xj; //被除数b,除数c,商s,余数y,新积xj

int x,i,j,k,lbz,lb; //循环变量x,i,j,k;被除数总位数lbz,单元数lb

int lcz,lc,l,jw,ss; //除数总位数lcz,单元数lc;商单元数l,进位jw,试商ss

//输入及转换:

printf("请连续输入被除数:"); gets(zfc); //读入被除数

lbz=strlen(zfc)-1; i=lb=lbz/4 1; //求被除数总位数lbz,单元数lb

for(x=lbz;x>=0;x--) //每4位为1单元,把被除数字符串转换成整数:

{ y[i]=y[i]*10 zfc[lbz-x]-48;

if(x%4==0) {i--;}

}

printf("请连续输入除数:");gets(zfc); //读入除数

lcz=strlen(zfc)-1; i=lc=lcz/4 1; //求除数总位数lcz,单元数lc

for(x=lcz;x>=0;x--) //每4位为1单元,把除数字符串转换成整数:

{ c[i]=c[i]*10 zfc[lcz-x]-48;

if(x%4==0) {i--;}

}

//做除法运算:

for(i=lb;i>=lc;i--) //1.定首位(从高位开始除):

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

s[i]=0; //商先置0(对不够除的:商0然后后移1单元)

while(y[i]>c[lc]) //够除则除:

{ if(y[i]>=214748) ss=y[i]/(c[lc] 1); //试商ss,加1为防商过大

else ss=(y[i]*10000 y[i-1])/(c[lc]*10000 c[lc-1] 1); //一次看两单元

if(ss==0) ss=1; //因余数大于除数,所以至少商1

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

for(k=1;k<=lc-1;k ) //除法核心运算:

{ xj=c[k]*ss jw; //新积=除数*试商 进位

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

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

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

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

}

xj=c[lc]*ss jw;

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

}

}

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

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

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

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

}

s[lc] ; //3)没有中途退出循环,说明余数 >= 除数,商加1,然后再减一遍:

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

{ if(y[x]<c[x]){y[x] =10000;y[x 1]--;} //借1当万

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

}

y[lc]-=c[lc];

}

tc: //退出循环标记

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

{ if(s[x]>=10000) {s[x 1] ;s[x]-=10000;}

}

if(s[lb]==0) lb--; //只有商的首单元可能为0

//输出:

printf("商=%d",s[lb]);lb--; //1.输出商的首单元

for(x=lb;x>=lc;x--) //输出商的其余单元:

{ if(s[x]>=1000) printf("'%d",s[x]);

else if(s[x]>=100) printf("'0%d",s[x]);

else if(s[x]>=10) printf("'00%d",s[x]);

else printf("'000%d",s[x]);

}

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

for(x=lc;x>=1;x--) //逐单元检查余数:

{ if(y[x]!=0||x==1) {lc=x;break;} //标记非0首单元,退出

}

printf("%d",y[lc]);lc--; //输出余数的非0首单元

for(x=lc;x>=1;x--) //输出余数的其余单元:

{ if(y[x]>=1000) printf("'%d",y[x]);

else if(y[x]>=100) printf("'0%d",y[x]);

else if(y[x]>=10) printf("'00%d",y[x]);

else printf("'000%d",y[x]);

}

return 0;

}

,