大数运算Word文档格式.docx

上传人:b****6 文档编号:21191092 上传时间:2023-01-28 格式:DOCX 页数:17 大小:45.57KB
下载 相关 举报
大数运算Word文档格式.docx_第1页
第1页 / 共17页
大数运算Word文档格式.docx_第2页
第2页 / 共17页
大数运算Word文档格式.docx_第3页
第3页 / 共17页
大数运算Word文档格式.docx_第4页
第4页 / 共17页
大数运算Word文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

大数运算Word文档格式.docx

《大数运算Word文档格式.docx》由会员分享,可在线阅读,更多相关《大数运算Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

大数运算Word文档格式.docx

intCompare(chara[],charb[])

{//比较字符串的大小,方法不同于strcmp函数,类似于整型常量的比较

intlena,lenb,i;

lena=strlen(a);

lenb=strlen(b);

if(lena<

lenb)

return-1;

elseif(lena>

return1;

else

{

if(strcmp(a,b)==0)

else

{

for(i=0;

lena;

{

if(a[i]>

b[i])

return1;

if(a[i]<

return-1;

}

}

}

/*算法:

先确定a和b中的最大位数k,然后依照由低至高位的顺序进行加法运算。

注意进位,若高位有进位,则c的长度为k+1。

*/

//高精度加法

voidBigNumberAdd(chara1[],charb1[])

{

inti,j,k,lena,lenb;

inta[1000]={0},b[1000]={0},d[1000]={0};

lena=strlen(a1);

lenb=strlen(b1);

//将加数与被加数化为整型数组,并且该数组的其他位为0

a[i]=a1[lena-i-1]-'

;

lenb;

b[i]=b1[lenb-1-i]-'

//当数组除了加数和被加数以外的整型数组元素均为时,无需考虑lena和lenb的大小

k=lena>

lenb?

lena:

d[i]=a[i]+b[i]+d[i];

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

d[i]=d[i]%10;

//若高位进

while(d[k])

k++;

while(!

d[k-1])

k--;

//001+0003=4

//将整型数组逆着转变并赋值给c字符型数组

for(j=0;

j<

j++)

c[j]=d[k-j-1]+'

if(Judge(c))//若全为,则只输出一个

strcpy(c,"

0"

);

依照由低位至高位的顺序进行减法运算。

在每次位运算中,

若出现不够减的情况,则向高位借位。

在进行了la的减法后,若最高

位为,则a的长度减。

若A、B大小未知,则需先判断大小。

//高精度减法

voidBigNumberSub(chara1[],charb1[])

{//a1为被减数,b1为减数

intlena,lenb,i,j,k,flag;

if(Compare(a1,b1)>

=0)

{//若被减数大于等于减数

for(i=0;

a[i]=a1[lena-1-i]-'

b[i]=b1[lenb-1-i]-'

flag=0;

//结果正的标志

{//若被减数小于减数

a[i]=b1[lenb-1-i]-'

b[i]=a1[lena-1-i]-'

flag=1;

//结果负的标志

{//大数减小数

if(a[i]<

{//若被减数不够减,向高位借一位

a[i+1]--;

d[i]=a[i]-b[i]+10;

d[i]=a[i]-b[i];

//若较高位已为,并且不止位时

d[i-1])

i--;

//根据flag,输出有无"

-"

if(!

flag)

{//将结果转化为字符逆着赋给数组c

if(!

i&

&

!

d[k-i-1])//若差的第一个字母为,则马上跳过

continue;

c[i]=d[k-i-1]+'

c[0]='

-'

for(i=1;

=k;

if(i==1&

d[k-i])//若差的第一个字母为,则马上跳过

c[i]=d[k-i]+'

//注意d的下标,不是k-i-1

if(Judge(c))//若差全为,则只输出一个

将多位数存入数组,低位在前、高位在后,

然后用一位数去乘数组的各位,考虑进位,最后按正常顺序输出*/

//高精度乘法--高精度乘以低精度

voidBigNumMultiSmall(chara1[],intb1)

inti,j,t;

inta[2000]={0};

//将字符串转化为整型数组,并逆置

t=strlen(a1);

t;

a[i]=a1[t-1-i]-'

//整型数组的每个元素乘以b1,然后对其进行求余,整除,使其只有一位数

a[0]=a[0]*b1;

for(i=1;

a[i]*=b1;

a[i]+=a[i-1]/10;

a[i-1]=a[i-1]%10;

while(a[i-1]>

9)

{//若最后一个元素大于

a[i]=a[i-1]/10;

i++;

//将得到的整型数组逆置赋给字符串

i;

c[j]=a[i-j-1]+'

if(Judge(c))//若积全为,则只输出一个

//高精度乘法--高精度乘以高精度

voidBigNumMultiBig(chara1[],charb1[])

inta[1000]={0},b[1000]={0},d[2000]={0};

b[i]=b1[lenb-i-1]-'

//计算乘数从低位到高位以此乘以被乘数的低位到高位

for(j=0;

d[i+j]=d[i+j]+a[i]*b[j];

d[i+j+1]+=d[i+j]/10;

d[i+j]=d[i+j]%10;

//根据高位是否为判断整型数组的位数

k=lena+lenb;

while(!

k--;

//积转化为字符型

c[i]=d[k-1-i]+'

if(Judge(c))//若积全为,则只输出一个

strcpy(c,"

//整型常量的阶乘

voidBigNumFact(intx)

inti,k,m=0,a[1000]={0};

a[0]=1;

for(;

x;

x--)

{//m为在求阶乘过程中a的元素个数

for(k=i=0;

=m;

k=k+a[i]*x;

//数组各个元素均乘以x(x递减),以完成阶乘的运算

a[i]=k%10;

k/=10;

while(k)

a[++m]=k%10;

//阶乘的结果转化为字符型

c[i]=a[m-i]+'

if(Judge(c))//若结果全为,则只输出一个

//1-整型常量的阶乘和

voidBigNumFactAdd(intt)

inti;

charsum[2000],d[2000];

//对字符串进行初始化

memset(d,0,sizeof(d));

memset(sum,0,sizeof(sum));

//分别求出相应i的阶乘然后相加

for(i=t;

i>

0;

i--)

BigNumFact(i);

strcpy(d,c);

memset(c,0,sizeof(c));

BigNumberAdd(d,sum);

strcpy(sum,c);

strcpy(c,sum);

//将结果赋值给全局变量,进行输出

//高精度的乘方,幂数为整型常量

voidBigNumInvol(chara1[],intb1)

chartemp[1000];

strcpy(temp,a1);

//注意乘方是自己乘自己,而不是结果乘结果

for(i=2;

b1;

BigNumMultiBig(a1,temp);

strcpy(temp,c);

//将c清空,防止出现错误

//进行最后一次乘法

BigNumMultiBig(a1,temp);

//高精度除法--高精度除以低精度,只产生余数

intBigNumDividSmall(chara1[],intb1)

b1)

return0;

inti,j,k,flag=0,a[1000]={0};

charb[2000];

memset(b,0,sizeof(b));

k=strlen(a1);

a[i]=a1[i]-'

z=0;

z=a[i]+z*10;

//除法过程

b[i]=z/b1+'

z=z%b1;

i=j=0;

while(b[i++]=='

for(i=i-1;

c[j++]=b[i];

//高精度除法--高精度除以高精度,只产生余数

voidBigNumDividBig(chara1[],charb1[])

chara[1000],b[1000],time[1000];

intlena1,lentime,i,j,k,flag=0;

memset(arr,0,sizeof(arr));

//若被除数小于除数,则商为0,余数为被除数

if(Compare(a1,b1)<

0)

strcpy(arr,a1);

//若两数相等,则商为,余数为0

elseif(!

Compare(a1,b1))

1'

//若被除数大于除数

j=lentime=0;

lena1=strlen(a1);

memset(b,0,sizeof(b));

memset(time,0,sizeof(time));

lena1;

{//计算得到被除数的前几位,得到整型数组形式的商

//time的一个元素表示一次相除的商

b[j++]=a1[i];

flag=0;

while(Compare(b,b1)>

BigNumberSub(b,b1);

strcpy(b,c);

memset(c,0,sizeof(c));

time[lentime]++;

flag=1;

//控制time的元素的位置

if(flag)//将商转换为字符

time[lentime]+='

else//当被除数前几位小于除数,商补0

time[lentime]='

strcmp(b,"

))//若b为‘’

j=0;

else//继续在b的后面加值

j=strlen(b);

lentime++;

k=0;

lentime;

if(time[i]!

break;

//找到time数组中第一个不为0的位置

for(j=i;

c[k++]=time[j];

strcpy(arr,b);

if(Judge(c))

if(Judge(arr))

strcpy(arr,"

intmain()

intflag=0,a3,k,i;

chara2[1000],b2[1000];

printf("

说明:

该程序适用于正整数的高精度运算,并且运算结果的位数在位以内。

\n"

while

(1)

printf("

/************************/\n"

1、两数相加\n"

2、两数相减\n"

3、大数与低精度相乘\n"

4、大数与大数相乘\n"

5、大数的阶乘\n"

6、大数的阶乘和\n"

7、大数的乘方\n"

8、大数除以低精度\n"

9、大数除以大数\n"

10、退出\n"

请输入你想要进行的操作数:

"

scanf("

%d"

&

k);

getchar();

switch(k)

case1:

printf("

请输入您想要进行运算的两个数字:

scanf("

%s%s"

a2,b2);

BigNumberAdd(a2,b2);

%s+%s=%s\n\n"

a2,b2,c);

break;

case2:

BigNumberSub(a2,b2);

%s-%s=%s\n\n"

case3:

%s%d"

a2,&

a3);

BigNumMultiSmall(a2,a3);

%s*%d=%s\n\n"

a2,a3,c);

case4:

BigNumMultiBig(a2,b2);

%s*%s=%s\n\n"

case5:

请输入您想要的阶乘数:

BigNumFact(a3);

%d!

=%s\n\n"

a3,c);

case6:

a3)

printf("

0!

=1\n\n"

BigNumFactAdd(a3);

for(i=1;

=a3;

i);

if(i!

=a3)

printf("

+"

c);

case7:

BigNumInvol(a2,a3);

%s^%d=%s\n\n"

case8:

if(BigNumDividSmall(a2,a3))

if(!

z)

%s/%d=%s\n\n"

else

%s/%d=%s……%ld\n\n"

a2,a3,c,z);

else

0不能作除数。

\n\n"

case9:

if(Judge(b2))

BigNumDividBig(a2,b2);

Judge(arr))

%s/%s=%s……%s\n\n"

a2,b2,c,arr);

%s/%s=%s\n\n"

case10:

flag=1;

感谢您的使用,再见。

default:

对不起,您的输入有误,请重新输入。

if(flag)

return0;

代码效果展示

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1