文档库 最新最全的文档下载
当前位置:文档库 › 7 C++求1到20的阶乘和

7 C++求1到20的阶乘和

7 C++求1到20的阶乘和

#include

void main()

{

int i;

long a=1;

long sum=0;

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

{

a*=i;

sum+=a;

}

cout<<"sum=:"<

阶乘的计算和处理程序设计

阶乘的计算及处理程序设计 一、问题描述 要求输入一个自然数n,求n!,同时统计结果中有几个0。 二、课题分析 1)计算n!。 2)统计0的个数。 三、数据结构的设计 x:输入的数n i:n! b:储存数据i上的各位上的数,从而判断b是否为0 j:统计0的个数 四、处理结构的设计 建立两个函数f1和f2,使f1函数起到求阶乘的作用,f2函数起到求0个数的作用。

求阶乘流程图

计算0的个数流程 五、源程序 1)主要结构体: f1函数: long int f1(int x) { long int i; //声明长整型变量i if (x==0||x==1) //采用递归函数f1求阶乘i=1; else i=f1(x-1)*x; return (i); }

f2函数: int f2(int i) {int j=0; int b=0; while(i>=10) //循环结构,判断末位是否为零,再去末位{b=i %10; if(b==0)j++; i=i/10; } return (j); } 2)整体: #include long int f1(int x) { long int i; if (x==0||x==1) i=1; else i=f1(x-1)*x; return (i); } int f2(int i) {int j=0; int b=0; while(i>=10) {b=i %10; if(b==0)j++; i=i/10; } return (j); } void main() {long int f1(int x); int f2(int x); long int k; int n,i; printf("please input n:"); scanf("%d",&n); k=f1 (n); i=f2 (k); printf("%d! is %ld\nthere are %d zero!\n",n,k,i);

阶乘运算

//阶乘各算法的 C++ 类实现 #include #include #include #include using namespace std; class Factorial { static const int MAXN = 5001; // 最大阶乘数,实际用不到这么大int *data[MAXN]; // 存放各个数的阶乘 int *nonzero; // 从低位数起第一个非0数字 int maxn; // 存放最大已经计算好的n的阶乘int SmallFact(int n); // n <= 12的递归程序 void TransToStr(int n, int *s); // 将数n倒序存入数组中 void Multply (int* A, int* B, int* C, int totallen); // 执行两个高精度数的乘法public: Factorial(); ~Factorial(); void Calculate(int n); // 调用计算阶乘 int FirstNonZero(int n); // 返回阶乘末尾第一个非0数字int CountZeros(int n); // 返回阶乘末尾有多少个0 int SecondNum(int n); // 返回阶乘左边的第二个数字 bool CanDivide(int m, int n); // 判断数值 m 是否可以整除 n! void Output(int n) const; }; int Factorial::SmallFact(int n) { if (n == 1 || n == 0) return 1; return SmallFact(n-1)*n; } void Factorial::TransToStr(int n, int *tmp) { int i = 1; while (n) { tmp[i++] = n%10; n /= 10; } tmp[0] = i-1; } void Factorial::Multply (int* A, int* B, int* C, int totallen) { int i, j, len; memset(C, 0, totallen*sizeof(int));

计算N的阶乘

北华航天工业学院 课程设计报告(论文) 设计课题:计算N的阶乘 专业班级: 学生姓名: 指导教师: 设计时间:2010年12月16日

北华航天工业学院电子工程系 微机原理与接口技术课程设计任务书 指导教师:刘金梅教研室主任: 2010年12 月18 日

内容摘要 本次课程设计编写计算N!的程序。数值N由键盘输入,结果在屏幕上输出,通过编制一个阶乘计算程序,了解怎样在汇编语言一级上实现高级语言中的数学函数。其难点在于随着N的增大,其结果远非寄存器所能容纳。这就必须把结果放在一个内存缓冲区中。然而乘法运算只限于两个字相乘,因此要确定好算法,依次从缓冲区中取数,进行两字相乘,并将DX中的高16位积作为产生的进位。 索引关键词:N的阶乘汇编语言内存缓冲区

目录 序言————————————————————5 正文————————————————————5 一、程序算法————————————————-—-5 二、源程序—————————————————-—-6 三、程序运行与调试—————————————-—11 四、N的阶乘程序流动图——————————-—-—11 心得体会——————————————————13 参考文献——————————————————13

序言 本文是关于微型计算机原理写文件课程设计。编写程序,将内存区域中用调试程序(DEBUG)设置好的一连串数据(以Ctrl+z为结束符)做为一个文件存入磁盘,文件名为DATA.ASM。内存区域的段地址和偏移地址在程序中输入。 随着计算机的高速发展,微型计算机已经应用到各个领域,微型计算机原理应用技术已经成为电子信息的核心产业。 微型计算机原理是计算机科学与技术、通讯工程、电气工程、机电工程的核心课程。 通过这次课程设计,是我们更好地理解了课程中所学的理论知识,并把实际问题转化为理论知识,学会如何把学到的知识用于解决实际问题,培养我们的动手能力。 正文 一、程序算法 阶乘的定义为N!=N(N-1)(N-2)……2,从左至右依次计算,结果保存在缓冲区BUF中。缓冲区BUF按结果由高到低依次排列。程序首先将BP初始化为N,N 不等于0或1则将N送入BUF缓冲区最低字节单元中。然后使BP为N-1,以后BP依次减1,直到变化为1为止。每次让BP与BUF中的字节单元按由低到高的次序相乘。低位结果AX仍保存在相应的BUF字节单元中,高位结果DX则送到进位字单元CY中,作为高字相乘时从低字来的进位,初始化CY为0.计算结果的长度随着乘积运算而不断增长。由字单元LEN指示。LEN单元初始化为1。当最高字单元与BP相乘时。若DX不为0,则结果长度要扩展。

关于阶乘的程序编写

数的阶乘 很多教材中的阶乘程序只是简单地用了阶乘的定义,算法比较简单,考虑也不够全面,其相应的程序如下: /* 数的阶乘(经典版)*/ #include"stdio.h" main() { extern jiecheng(int n); int n; printf("请输入一个数:"); scanf("%d",&n); jiecheng(n); } extern jiecheng(int n) { long result=1; int i; for(i=1;i<=n;i++) result*=i; printf("该数的阶乘为:%ld\n",result); } 该函数在参数n比较小的时候运行完全正常,但是随着n变大(如,超过12)就出现

了问题,结果会溢出而变成意料之外的数据,究其原因,是因为任何基本类型的变量都有一定的表示范围。要计算更大参数的阶乘,可以使用数组存放阶乘结果,于是有了下面的程序: /* 数的阶乘(改进版)*/ #include"stdio.h" main() { int n; printf("请输入一个数:"); scanf("%d",&n); jiecheng(n); } int jiecheng(int n) { int m,i,j,c,t,a[1000]; a[0]=1; m=1; for(i=2;i<=n;i++) { for(c=0,j=0;j

} while(c) { a[m++]=c%10; c/=10; } } printf("该数的阶乘为:"); for(j=m-1;j>=0;j--) printf("%d",a[j]); printf("\n"); } 这样一来,就可以计算大数的阶乘了。如有疑问,多谢赐教!

采用汇编语言实现阶乘运算

汇编语言程序设计报告 课程设计题目:采用汇编语言实现阶乘运算 学号:10081437 姓名:张子琦 院系:测试与光电工程学院 专业:测控技术与仪器 指导教师:陈振华

采用汇编语言实现阶乘运算 学生姓名:张子琦班级:10081437 指导老师:陈振华 摘要:汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。因此掌握汇编语言是学好微机原理和接口设计的第一步。编写计算N!的程序。数值由键盘输入,结果在屏幕上输出。[1] 关键字:汇编语言N!键盘输入屏幕输出 指导老师签名:

Factorial implemented in assembly language Student name :Ziqi Zhang Class:10081437 Supervisor:Zhenhua Chen Abstract:Assembly language is the basis of the principles and applications of the microcomputer, the microcomputer host functions and interfaces to achieve should be achieved through the assembly language. Despite the low efficiency of assembly language programming programming, but it’s high operating efficiency, and speed. Therefore, the assembly language is the first step to learn Microcomputer Principle and Interface Design. Written calculation of N! Procedures. Numerical keyboard input, output results on the screen. Key words:Assembly language N! Keyboard input Screen output Signature of Supervisor:

阶乘排列组合公式计算

阶乘排列组合公式计算 加法原理:做一件事,完成它可以有N类加法,在第一类办法中有M1种不同的方法,在第二类办法中有M2种不同的方法,……,在第N类办法中有MN种不同的方法。那么完成这件事共有N=M1+M2+...+MN 种不同的方法。即一次性完成的用加法原理。 乘法原理:做一件事,完成它需要分成N个步骤,做第一步有M1种不同的方法,做第二步有M2种不同的方法,……,做第N步有MN种不同的方法,那么完成这件事共有 N=M1×M2×... ×MN 种不同的方法。即二次以上完成的用乘法原理。 排列:从N个不同元素中,任取M(M<=N)个元素,按照一定的顺序排成一列,叫做从N个不同元素中取出M个元素的一个排列。 排列数:从N个不同元素中取出M(M<=N)个元素的所有排列的个数,叫做从N个不同元素中取出M个元素的排列数。记作:Pmn 排列数公式:Pmn =n(n-1)(n-2)...(n-m+1) 全排列:N个不同元素全部取出的一个排列,叫做N个不同元素的一个全排列。 自然数1到N的连乘积,叫做N的阶乘。记作:n! 。0!=1。 全排列公式:Pnn =n! 排列数公式还可写成:Pmn = n!/(n-m)! 组合:从N个不同元素中,任取M(M<=N)个元素并成一组,叫做从N个不同元素中取出M个元素的一个组合。 排列与元素的顺序有关,组合与元素的顺序无关。 组合数:从N个不同元素中取出M(M<=N)个元素的所有组合的个数,叫做从N个不同元素中取出M个元素的组合数。记作:Cmn 组合数公式:Cmn = Pmn / Pmm = n(n-1)(n-2)...(n-m+1)/m! = n!/m!/(n-m)! 组合性质1:Cmn = Cn-mn ( C0n =1) 组合性质2:Cmn+1 = Cmn + Cm-1n

VB程序设计-多种方法求阶乘

VB程序设计-多种方法求阶乘 (作者:草原飞狼 2014年5月26日) 声明:仅供学习与交流使用,高手请飘过,谢谢! 布局 运行界面(1)

运行界面(2) 源代码如下: Private Sub Command1_Click() Rem 求任意数阶乘,不大于171 Dim mul As Double Dim i As Integer Dim k As Integer mul = 1 '赋初值 k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下算法是求指定数的阶乘,典型的算法 For i = 1 To k mul = mul * i Next i Print k & "的阶乘结果是:"; mul End Sub Private Sub Command2_Click() Rem 清空 Form1.Cls End Sub Private Sub Command3_Click() Rem 退出 Unload Me End Sub Private Sub Command4_Click()

Rem 普通过程求阶乘 Dim mul As Double Dim i As Integer Dim k As Integer mul = 1 '赋初值 k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下算法是求指定数的阶乘 Call fac(k) '函数调用,注意调用方法 Print k & "的阶乘结果是:"; fac(k) End Sub Private Function fac(ByVal k As Integer) As Double 'byval表示参数按值传递Rem 普通的函数过程 Dim i As Integer Dim mul As Double mul = 1 For i = 1 To k mul = mul * i Next i fac = mul '结果返回给函数,典型的用法End Function Private Sub Command5_Click() Rem 递归过程求阶乘 Dim i As Integer Dim k As Integer Dim mul As Double mul = 1 '赋初值 k = Val(InputBox("请输入一个正整数,不大于171!", "输入提示", "5")) Rem 以下递归函数的调用 Call fac_digui(k) Print k & "的阶乘结果是:"; fac_digui(k) End Sub Private Function fac_digui(ByVal k As Integer) As Double Rem 递归过程求阶 Rem 以下是递归算法求阶乘,注意写法,编写递归算法时,方法类似 If k = 1 Then fac_digui = 1 Else fac_digui = fac_digui(k - 1) * k End If End Function

阶乘的因数的个数

给定两个数m,n 求m!分解质因数后因子n的个数。 这道题涉及到了大数问题,如果相乘直接求的话会超出数据类型的范围。 下面给出一种效率比较高的算法,我们一步一步来。 m!=1*2*3*……*(m-2)*(m-1)*m 可以表示成所有和n倍数有关的乘积再乘以其他和n没有关系的 =(n*2n*3n*......*kn)*ohter other是不含n因子的数的乘积因为kn<=m 而k肯定是最大值所以k=m/n =n^k*(1*2*......*k)*other =n^k*k!*other 从这个表达式中可以提取出k个n,然后按照相同的方法循环下去可以求出k!中因子n的个数。 每次求出n的个数的和就是m!中因子n的总个数 先说一个定理: 若正整数n可分解为p1^a1*p1^a2*...*pk^ak 其中pi为两两不同的素数,ai为对应指数 n的约数个数为(1+a1)*(1+a2)*....*(1+ak) 如180=2*2*3*3*5=2^2*3^2*5 180的约数个数为(1+2)*(1+2)*(1+1)=18个。 若求A/B的约数个数,A可分解为p1^a1*p2^a2*...*pk^ak,B可分解为q1^b1*q1^b2*...*qk^bk,则A/B 的约数个数为(a1-b1+1)*(a2-b2+1)*(a3-b3+1)...*(ak-bk+1). 然后说N的阶乘: 例如:20! 1.先求出20以内的素数,(2,3,5,7,11,13,17,19) 2.再求各个素数的阶数 e(2)=[20/2]+[20/4]+[20/8]+[20/16]=18; e(3)=[20/3]+[20/9]=8; e(5)=[20/5]=4; ... e(19)=[20/19]=1; 所以 20!=2^18*3^8*5^4*...*19^1

阶乘算法

高精度算法的基本思想,就是将无法直接处理的大整数,分割成若干可以直接处理的小整数段,把对大整数的处理转化为对这些小整数段的处理 数据结构的选择 每个小整数段保留尽量多的位 使用Comp类型 采用二进制表示法 每个小整数段保留尽量多的位 一个例子:计算两个15位数的和 ?方法一 ?分为15个小整数段,每段都是1位数,需要15次1位数加法 ?方法二 ?分为5个小整数段,每段都是3位数,需要5次3位数加法 ?方法三 ?Comp类型可以直接处理15位的整数,故1次加法就可以了 ?比较 ?用Integer计算1位数的加法和3位数的加法是一样快的 ?故方法二比方法一效率高 ?虽然对Comp的操作要比Integer慢,但加法次数却大大减少 ?实践证明,方法三比方法二更快 使用Comp类型 高精度运算中,每个小整数段可以用Comp类型表示 Comp有效数位为19~20位 求两个高精度数的和,每个整数段可以保留17位 求高精度数与不超过m位整数的积,每个整数段可以保留18–m位

求两个高精度数的积,每个整数段可以保留9位 如果每个小整数段保留k位十进制数,实际上可以认为其只保存了1位10k进制数,简称为高进制数,称1位高进制数为单精度数 采用二进制表示法 采用二进制表示,运算过程中时空效率都会有所提高,但题目一般需要以十进制输出结果,所以还要一个很耗时的进制转换过程。因此这种方法竞赛中一般不采用,也不在本文讨论之列. 算法的优化 高精度乘法的复杂度分析 连乘的复杂度分析 设置缓存 分解质因数求阶乘 二分法求乘幂 分解质因数后的调整 高精度乘法的复杂度分析 计算n位高进制数与m位高进制数的积 ?需要n*m次乘法 ?积可能是n+m–1或n+m位高进制数 连乘的复杂度分析(1) 一个例子:计算5*6*7*8 ?方法一:顺序连乘 ?5*6=30,1*1=1次乘法 ?30*7=210,2*1=2次乘法

n的阶乘程序报告

HUNAN UNIVERSITY 程序设计训练报告 题目求n! 学生姓名 学生学号 专业班级 学院名称 指导老师 2013 年 7 月 11 日

目录 第一部分程序功能简介 (3) 第二部分本人完成的主要工作 (3) 第三部分设计方案 (4) (一)设计分析 (4) (二)模块的功能及程序说明 (5) (三)核心源程序模块 (7) (四)核心算法流程图 (8) (五)操作方法简介 (9) (六)实验结果 (9) (七)设计体会 (10) 第四部分附录 ....................... 错误!未定义书签。 (一)程序中主要变量的功能说明........ 错误!未定义书签。 (二)源程序代码...................... 错误!未定义书签。

第一部分程序功能简介 该程序是求一个大数n的阶乘(n!),n的值范围从1~100之间变化。输出结果从右往左每四个数之间用一个“,”隔开。 第二部分本人完成的主要工作 刚开始,我尝试着通过递归函数(如下)将100!的结果算出 结果发现无法得到正确结果(100的阶乘输出为0),询问后知道由于100的阶乘结果太大,用长字符串也会溢出导致无法显示,所以只能将阶乘后结果的个、十、百、千...位依次赋数给数组a[200]来解决这一问题。 数组a[200]的引入也让n阶乘结果的位数昭然若揭,又使用for循环使输出结果从右往左每四个数之间用一个“,”隔开。 最终设计出一个程序求一个大正整数数的阶乘(n!),n的值范围从1~100之间变化(输出结果从右往左每四个数之间用一个“,”隔开)。然后对程序进行编译,运行,并不断完善细节,不断优化。

经验技巧6-2 大数阶乘优化算法

经验技巧6-2 大数阶乘优化算法 【例6-6】给出了大数阶乘的算法,该算法使用数组存放阶乘的结果,每一个数组元素存放结果的一位。计算十万的阶乘需要近260秒的时间,实际上只要程序中的N足够大,还可以求更大数的阶乘,但程序执行的时间会更长,可能要几个小时,甚至更长,因此需要考虑对算法进行优化。 int型数组的每一个元素可以存放的最大整数为2147483647,是一个十位数,而算法中每一个元素只存放结果的一位,显然太浪费了。 由于算法中需要计算自然数n与数组元素值的乘积加上前一位的进位,所以每个数组元素的位数不能太多,否则将超过最大整数2147483647而导致溢出,如果每个数组元素存放4位数,大约可计算到二十万的阶乘,确保结果是精确的,如果再使用无符号基本整型,大约可计算到四十万的阶乘,确保结果是精确的。 由此,定义符号常量M的值为10000作为模数,符号常量B的值为4表示数组元素存放的最多位数,符号常量N的值为600000表示n!结果位数的B分之一,存放n!结果的数组bit定义为静态无符号基本整型。 计算i!时将原来的用10除处理进位和余数改为用M除。 由于除存放最高位的元素外,每个元素都存放B位,而存放最高位的元素可能不足B位,输出前需先统计存放最高位元素bit[k]的位数,另外,低位的0(只能输出一个0)和不足B位的应使用B个输出域宽,不足的用0补足,才能保证其它各位均输出B位。 其它说明详见程序代码中的注释。 优化的程序代码: (1)#include "stdio.h" (2)#define M 10000//M与n的乘积不能超过4294967295 (3)#define B 4//数组元素存放的最多位数 (4)#define N 600000 //n!的位数,要足够大 (5)int fact(int bit[],int n) (6){ (7)int i,j,k=N-1,carry;//k表示第一个非0元素的下标 (8)bit[k]=1; (9)for(i=2;i<=n;i++) (10){ (11)carry=0;//carry表示进位数,开始进位数为0 (12)for(j=N-1;j>=k;j--) (13){

常用经典算法(整理中)

C语言经典算法及程序 算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、一些简单算法 1.求两个整数的最大公约数、最小公倍数 2.判断素数 3.验证哥德巴赫猜想 4.超级素数 5.猴子选大王 6.数的全排列 7.迭代法求平方根 二、排序算法 1.选择排序 2.冒泡排序 3.插入排序 4.快速排序 5.第K小元素 6.二分查找法

三、高精度数算法 1.已知P,且P×S=11...1,求S及1的个数 2.高精度数加法 3.高精度数减法 4.高精度数乘法 5.高精度数除法 6.高精度数阶乘 7. Fibonacci数列 四、数据结构相关问题 1.左右括号配对 2.多项式相加 3.N叉树 五、复杂算法 1.N女王问题 六、动态规划实例应用 1.求序列的最大连续序列和 2.求序列的最长下降子序列长度 3.数塔问题(解法一) 4.数塔问题(解法二)

一、一些简单算法 1.求两个整数的最大公约数、最小公倍数 最大公约数算法:(最小公倍数=两个整数之积/最大公约数) (1) 对于已知两数m,n,使得m>n; (2) m除以n得余数r; (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4); (4) m←n,n←r,再重复执行(2)。 程序: #include "stdio.h" int main( ) { int nm,r,n,m,t; printf("please input two numbers:\n"); scan f("%d,%d”,&m,&n); nm=n*m; if (mn*/ r=m%n; while (r!=0) { m=n; n=r; r=m%n; } printf("最大公约数:%d\n",n); printf("最小公倍数:%d\n",nm/n); return 0;}

大数阶乘算法

*************************************(1)************************************ **************** 假如需要计算n+16的阶乘,n+16接近10000,已经求得n!(共有m个单元),(每个单元用一个long数表示,表示1-100000000) 第一种算法(传统算法) 计算(n+1)! 需要m次乘法,m次加法(加法速度较快,可以不予考虑,下同),m次求余(求本位),m次除法(求进位),结果为m+1的单元 计算(n+2)! 需要m+1次乘法,m+1次求余,m+1次除法, 结果为m+1个单元 计算(n+3)! 需要m+1次乘法,m+1次求余,m+1次除法,结果为m+2个单元 计算(n+4)! 需要m+2次乘法,m+2次求余,m+2次除法,结果为m+2个单元 计算(n+5)! 需要m+2次乘法,m+2次求余,m+2次除法,结果为m+3个单元 计算(n+6)! ... 计算(n+7)! ... 计算(n+8)! ... 计算(n+9)! ...

计算(n+10)! ... 计算(n+11)! ... 计算(n+12)! ... 计算(n+13)! ... 计算(n+14)! 需要m+7次乘法,m+7次求余,m+7次除法,结果为m+7个单元 计算(n+15)! 需要m+7次乘法,m+7次求余,m+7次除法,结果为m+8个单元 计算(n+16)! 需要m+8次乘法,m+8次求余,m+8次除法,结果为m+8个单元 该算法的复杂度:共需:m+(m+8)+(m+1+m+7)*7=16m+64次乘法,16m+64次求余,16m+64次除法 第二种算法: 1.将n+1 与n+2 相乘,将n+3 与n+4 相乘,将n+5 与n+6...n+15与n+16,得到8个数,仍然叫做n1,n2,n3,n4,n5,n6,n7,n8 2. n1 与n2相乘,结果叫做p2,结果为2个单元,需要1次乘法。 p2 与n3相乘,结果叫做p3,需要2次乘法,1次加法(加法速度快,下面省略),2次除法,2次求余 p3 与n4相乘,结果叫做p4,需要3次乘法,3次除法,3次求余

求某数的阶乘的4种方法

求某数的阶乘 /************while循环*******/ #include void main() { //定义数据类型 int i=1,n,s=1; //指示数字的输入 printf(“请输入所计算的数字:\n”); scanf(“%d”,&n); //以下为循环体 while(i<=n){ s=s*i; i++; } Printf(“所的结果为:%d\n”,s); } /********do-while循环*******/ #include void main() { //定义数据类型 int i=1,n,s=1; //指示数字的输入 printf(“请输入所计算的数字:\n”); scanf(“%d”,&n); //以下为循环体 do{ s=s*i; i++; }while(i<=n); printf(“所求的结果为:%d\n”,s); }

/**********for循环*********/ #include void main() { //定义数据类型 int i=1,n,s=1; //指示数字的输入 printf(“请输入所计算的数字:\n”); scanf(“%d”,&n); //以下为循环体 for(i=1;i<=n;i++) s=s*i; printf(“所得结果是:%d\n”,s); } /*********定义阶乘函数**********/ #include void main() { //定义数据类型 int n; long resn; long fact(int k); //定义阶乘函数 //指示数字的输入 printf("请输入所计算的数字:\n"); scanf("%d",&n); resn=fact(n); printf("所得结果是:%d\n",resn); } long fact(int k) { int i; long res=1; for(i=1;i<=k;i++)

C语言编写的多位阶乘算法程序

多位阶乘/*本程序是以计算 30000 的阶乘为例*/ /* This file "jiech2.c" created at 2001-08-24 20:15:22 by LeiPeng . */ #include #include #include #include #include #include #define MAXN 0X7000 int a[MAXN]; int main(int argc,char *argv[]) { int n,m,i,j,c,t; printf("Enter n(n>=2) :"); while(1) { scanf("%d",&n); if(n>=2&&n<=3276) break; printf("must be 2<=n<=3276"); } a[0]=1; m=1; for(i=2;i<=n;i++) { for(c=0,j=0;j=0;i--) putchar(a[i]+0x30); printf("\npress any key to continue .\n"); getch(); return 0;

} /*3000!得结果超出了电脑能显示得范围,所以最好采用数组来记录每位*/

阶乘、矩阵的简单运算

《数学实验》报告 实验名称 MATLAB与数学实验学院 专业班级 姓名 学号 2014年 4月

一、 【实验目的】: 1.了解MATLAB 的工作环境 2.掌握MATLAB 的基本操作及常用命令 3.学习如何编辑函数及函数的调用 二、 【实验任务】: 1.编写函数文件,计算∑=n k k 1!,并求出当k=20时表达式的值。 2.矩阵A=[1 2 3 ;4 5 6 ;7 8 9 ],B=[4 6 8;5 5 6;3 2 2],计算A*B ,A.*B,并比较两者区别 。 3.已知矩阵A=[5 2 ;9 1] , B=[1 2;9 2],做简单的关系运算A>B,A==B,AB). 4.用4π=1-31+51-7 1 +…公式求π的近似值,知道某一项的绝对值小于10^(-6)为止。 三、 【实验程序】: 1.function y=jiecheng(x); s=1; m=0; for i=1:x; s=s*i; m=m+s; y=m; End 2.A=[1 2 3;4 5 6;7 8 9]; B=[4 6 8;5 5 6;3 2 2]; C=A*B D=A.*B 3.A=[5 2;9 1]; B=[1 2;9 2]; C=A>B D=A==B E=AB)

4.i=1; n=0; s=0; while n<=10000000 s=s+(-1)^n*(1/i); i=i+2; n=n+1; end disp('PI='),4*s 四、【实验结果】.

c语言题目(求阶乘)

求阶乘 1. 该fun函数的功能是求10的阶乘。 1) #include 2) long fun ( int n) 3) {if (___1___) 4) return (n*fun(___2___)); 5) else if ( ___3___) 6) return 1;} 第一处:n>1 第二处:n-1· 第三处:n==1 解析:从第2、4行看到了函数名,函数体中又出现了函数的调用,则是递归。我们知道:n!=n*(n-1)! 这就是一个递归的表达式,写成函数就是fun(n)=n*fun(n-1)。因此,4行处填写n-1。又:1!=1 故3,5行就好填了。因此答案是n>1 n-1 n==1。还有0!=1 故,还可填写:n>0 n-1 n==0 注意:3 5行的条件是相反的,这也是if与else条件的互斥性。 2. 程序的功能是计算s=1!+2!+3!+……+n! 1) long fun(int n) 2) { int i; 3) long s; 4) s=___1___; 5) for (i=1; i<=n; i++) 6) s=___2___; 7) return s; 8) } 9) main() 10) { long s; 11) int k,n; 12) scanf("%d",&n); 13) s=___3___; 14) for (k=1; k<=n; k++) 15) s=___4___; 16) printf("%ld\n", s); 17) } 第一处:1 第二处:s*i 第三处:0

第四处:s+fun(k) 解析:首先,搞清楚函数fun、main各自的功能。 Fun是求一个数的阶乘,我们知道:n!=1*2*3*…*n 同时要死记住:求积,积的初值一般等于1。故fun中s是用来存放积的,其初值等于1;求阶乘是连乘,故s=s*i Main是求和,记住:和的初值一般等于0. 两个函数中的局部变量s的作用是不同的。Main中的s是存放和的。 最后:注意一些变量的类型。 阶乘是求积,积的增长速度是比较快的,为防止溢出,fun的返回值类型是long。输出中ld 是输出长整数。 3. 请补全main函数,该函数的功能是: 求1+2!+3!+…+N!的和。 1) main() 2) {int i,n; 3) long s=0,t=1; 4) //clrscr(); 5) printf("\nInput n:\n"); 6) scanf("%d",___1___); 7) for(i=1;i<=n;i++) 8) { 9) t=___2___; 10) s=___3___; 11) } 12) printf("1!+2!+3!...+%d!=%ld\n",n,s); 13) } 第一处:&n 第二处:t*i 第三处:s+t 解析:求前n项的阶乘之和。这里没有使用子函数。 我们知道:5!=5*4!。即需要利用前一个数的阶乘,还有就是替换。 从第3行可知:s存放和,t存放积。 输入n ,记住应是&n。 i是循环变量。 记住:填空后,手工地将循环执行几次,检验是否正确。 求和、平均值 1. 请补全main函数,该函数的功能是:从键盘输入一个长整数,如果这个数是负数,则取它的的绝对值,并显示出来。

高精度计算n阶乘的c语言源代码和解释

高精度计算大数阶乘的c语言源代码和解释关键词:高精度,大数,阶乘,C,输入的容错处理, 内容介绍:利用高精度计算n阶乘的c语言源代码及其解释,其中还包括一些在C语言中常用的简单编程习惯和技巧,非常适合C语言初学者借鉴,如果好好的把程序调试一遍会对初学者很大的启发。程序中没有用到指针,结构体,共用体等内容,但运用了预编译,头文件,数组等等知识,特别是对getchar()进行输入容错的运用,并有详细的解释! 算法简介:高精度计算n的阶乘其实是高精度大整数乘法的应用,其核心思想就是把计算结果每一位上的数字保存到一个数组成员中,例如:把567保存至数组中,保存结果应该是result[0] =7;result[1] =6;result[2] =5。把整个数组看成一个数字,这个数字和一个数相乘的时候,需要每一位都和这个乘数进行相乘运算还需要把前一位的进位加上。算法如下:int 结果= result[x] * 乘数+ 进位;每一位的计算结果有了,把这个结果的个位数拿出来放到这个数组元素上:result[x] = 结果%10;接下来的工作就是计算出进位:进位= 结果/ 10;这样一位一位的把整个数组计算一遍,最后可能还有进位,用同样的方法,把进位的数值拆成单个数字,放到相应的数组元素中。最后从后往前输出结果。 getchar()使用说明:getchar()有一个int型的返回值.当程序调用getchar()时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当 用户键入回车之后, getchar()才开始从stdio流中每次读入一个字符. getchar()函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar()调用读取.也就是说,后续的getchar()调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后, 才等待用户按键. getch()与getchar()基本功能相同,差别是getch()直接从键盘获取键值,不等待用户按回车,只要用户按一个键, getch()就立刻返回, getch()返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上. getch()函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch()函数暂停程序运行,当按任意键后程序继续运行. 下面是用高精度计算n阶乘的c语言源代码:(还附有正整数输入的容错处理函数)程序特点:程序使用了数组的方法,虽然效率不高,但适合初学者学习。程序在VC++6.0,VC++2010测试通过。程序1使用了一个大数组,程序2使用了4个数组组合在一起,其实程序2完全是锻炼初学者的程序分析能力而已。由于系统限制,程序1中当把HEAD_M 设为250000(不能超过该数)时,可以计算不要大于50000的阶乘。程序2不能HEAD_M不能超过70000,由此可知其实用多数组是无意义的! 程序1: //本程序适合学习c语言的初学者调试学习,程序中没有用到指针,结构体,共用体等内容//本来下面的代码是一个头文件,文件名是:headself.h 里面只有一个输入正整数的函数。//把自己经常用的一些变量,函数等等放入自编的头文件是一个很好的习惯。 /*begin包含头文件********************/ #include

相关文档
相关文档 最新文档