大数的阶乘n.docx

上传人:b****2 文档编号:18115773 上传时间:2023-08-13 格式:DOCX 页数:10 大小:168.94KB
下载 相关 举报
大数的阶乘n.docx_第1页
第1页 / 共10页
大数的阶乘n.docx_第2页
第2页 / 共10页
大数的阶乘n.docx_第3页
第3页 / 共10页
大数的阶乘n.docx_第4页
第4页 / 共10页
大数的阶乘n.docx_第5页
第5页 / 共10页
大数的阶乘n.docx_第6页
第6页 / 共10页
大数的阶乘n.docx_第7页
第7页 / 共10页
大数的阶乘n.docx_第8页
第8页 / 共10页
大数的阶乘n.docx_第9页
第9页 / 共10页
大数的阶乘n.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

大数的阶乘n.docx

《大数的阶乘n.docx》由会员分享,可在线阅读,更多相关《大数的阶乘n.docx(10页珍藏版)》请在冰点文库上搜索。

大数的阶乘n.docx

大数的阶乘n

信息科学与工程学院

编程设计实验文档

题目:

较大数的阶乘

 

1、设计目的:

1.解决一般大数的阶乘问题,可以避免一般算法实行时的数据溢

出的弊端

2.培养自己对算法的理解,提高自身的水平

3.熟练对c语言的操作,加强对c语言的理解

2、设计分析:

实现一般较小的数的阶乘,可以直接利用普通的乘法进行循环

运算即可,即利用s=n*(n-1)的核心算法。

但是,当n比较

大的时候,会造成运算的结果,即s会变得特别大,便会造成

数据溢出。

此时,就需要另一种算法,是结果可以保存,不溢

出。

那么,这个算法就是要解决这个问题,所以,我想到另一

方式用来解决这个问题,即利用数组。

如下:

首先,定义两个整型的数组:

inta[200];//暂且先设定是200位,我称之为“结果数组”

intadd[200];//我称之为“进位数组”

现在具体说明两个数组的作用:

1.a[200]

比如说,一个数5的阶乘是120,那么我就用这个数组存储它:

a[0]=0

a[1]=2

a[2]=1

因此,用这样的数组我们可以放阶乘后是200位的数

2.在介绍add[200]之前,我介绍一下算法的思想,就以6!

例:

从上面我们知道了5!

是怎样存储的。

就在5!

的基础上来计算6!

,演示如下:

fac[0]=fac[0]*6=0

fac[1]=fac[1]*6=12

fac[2]=fac[2]*6=6

3.现在就用到了我们的:

“进位数组”add[1000].

先得说明一下:

add[i]就是在第2步中用算出的结果中,第

i位向第i+1位的进位数值。

还是接上例:

add[0]=0;

add[1]=1;//计算过程:

就是(a[1]+add[0])%10=1

add[2]=0;//计算过程:

就是(a[2]+add[1])%10=0

.......

.......

.......

add[i+1]=(a[i+1]+add[i])%10

3、算法流程图

N

Y

N

Y

 

4、主要模块功能及程序说明

本程序主要分为三个模块,第一个模块就是判断输出是否错误,

当输入的数据是小于1的时候,程序的输出结果是显示“输入

错误;第二个模块当输入正确时模拟一个乘法的运算,先算出

该数的阶乘是多少兵保存在a[200]这个数组中;第三个模块

根据所得结果位数的判断如何按4个数字一组的输出这个数,

当所得结果为4的倍数时,我选择的是单独输出末尾四个数,

剩下的按“1234,”这样的形式输出,当所得结果不是4的倍

数时,我选择优先输出前面的几个数,把后面的数字按四个一

组“,1234”这样的形式输出。

5、实验结果:

1.当输出的数字小于0的时候

2.当输入的数所得的结果是4的倍数时,如输入11时

 

3.当输入的数所得的结果不是4的倍数时,如15

 

附录

A变量及函数功能说明

n是输入的数据

S是输出结果的位数除以4所得的余数

t是输出结果的位数除以4所得的商值

a[200]是用来保存最后结果的数组

temp为阶乘的任一元素与临时结果的某位的乘积结果

digit表示所得结果的位数

carry表示进位

B.源程序代码

#include

intmain()

{

intn,s,t;

inta[200];

intcarry;

intdigit=1;

inttemp,i,j;

scanf("%d",&n);

a[0]=1;

if(n<1)

printf("输入错误/n");

else

{

for(i=1;i<=n;++i)

{

for(j=1,carry=0;j<=digit;++j)

{

temp=a[j-1]*i+carry;

a[j-1]=temp%10;

carry=temp/10;

}

while(carry)

{

a[++digit-1]=carry%10;

carry/=10;

}

}

t=digit/4;

s=digit%4;

if(s==0)

{

for(i=t;i>1;i--)

printf("%d%d%d%d,",a[4*i-1],a[4*i-2],a[4*i-3],a[4*i-4]);

printf("%d%d%d%d",a[3],a[2],a[1],a[0]);

}

else

{

for(i=digit-1;i>=digit-s;i--)

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

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

printf(",%d%d%d%d",a[4*i-1],a[4*i-2],a[4*i-3],a[4*i-4]);

}

}

}

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2