P99用递归法求阶乘

P99用递归法求阶乘
P99用递归法求阶乘

#include

int fac(int n)

{

if(n<0)

{

cout<<"error!"<

return -1;

}

else if(n<=1)

return 1;

else

return(n*fac(n-1));

}

int main()

{

int fac(int n);

int n;

cout<<"input n:"<

cin>>n;

cout<

return 0;

}

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

阶乘的计算及处理程序设计 一、问题描述 要求输入一个自然数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,则结果长度要扩展。

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

汇编语言程序设计报告 课程设计题目:采用汇编语言实现阶乘运算 学号: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

阶乘算法

高精度算法的基本思想,就是将无法直接处理的大整数,分割成若干可以直接处理的小整数段,把对大整数的处理转化为对这些小整数段的处理 数据结构的选择 每个小整数段保留尽量多的位 使用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阶乘(0到FFFFH)

一、设计题目 编写计算N!的程序(数值N由键盘输入,结果在屏幕上输出。N的范围为0-65535,即刚好能被一个16位寄存器容纳)。 二、开发目的 由于当N值较大时(N>10),N的阶乘计算很繁琐并且计算容易出错。 所以可以编写计算N!的程序,利用计算机强大的计算能力计算N!。这不仅能节省繁琐计算的时间,而且得到的N!的积比起手工算的要准确。 三、设计方案 N的阶乘为1*2*3……(N-1)*N,N的范围为(0000H—FFFFH),N!以字为单位存在一个或几个定义的数据段中。 若已算到(n-1)!,假如它占4个字的空间,接下来它乘以n的原理,如图1所示。

图1 (n-1)!* n的原理 因此计算N!的算法可以这样编写,当前n!的值为被乘数,内容存在str2中,单位为字,n+1的值为乘数,存在str1中,单位也为字。被乘数从str2首地址中内容开始与乘数相乘,得到32位的积,它的低16位覆盖掉当前被乘数所在存储空间的内容。接着str2下一个字的内容与乘数相乘,也得到32位的积,前一个积的高16位与现在积的低16位相加,它们的和覆盖掉当前被乘数所在存储空间的内容,若它们的和有进位,把进位加到现在积的高16位。直到把str2中内容乘完。然后乘数增1,循环上面的内容。 直到执行完(N-1)!*N 输入的N为4位16进制数,输出也为16进制数。 四、程序流程图

五、程序清单 data1 segment input1 db 'please input the number :','$' input2 db 10,?,10 dup(?) ;输入的16进制数 error db 'Out of range','$' output1 db 'The answer is 1','$' output2 db 'The answer is :','$' str1 dw 100 dup(?) ;保存1—N(后一个数覆盖前一个数)str2 dw 7000h dup(?) ;N!乘积的值(1) p dw 100 dup(?) ;上一个乘积的高16位 data1 ends data2 segment str3 dw 7fffh dup(?) ;N!乘积的值(2) data2 ends code segment assume cs:code,ds:data1,es:data2 org 100h ;程序从偏移地址100h开始执行 start: mov ax,data1 ;程序初始化 mov ds,ax mov ax,data2 mov es,ax ;初始化结束 mov ah,9 lea dx,input1 int 21h

天文数的阶乘计算

天文数的阶乘计算 在C语言里unsigned long int型的的整数的仅可表示0~4294967295之间的数,而12! = 479001600,13! = 6227020800。可见,用unsigned long int型的整数做阶乘运算时最多只能计算到12的阶乘。用函数double sqrt(double x)做开方算运算时,只能计算到16位有效数字。long double型的实数虽然可表示10-4931~10-4932的数,但其有效数字也只有18~19位。 我编写了一个"天文数字计算"程序突破了这一限制,可以把数字的长度扩充到无穷多位。除了能做加、减、乘、除、求模等基本运算外还可以做阶乘、乘方、开平方等运算。 例如:10000! = ?、(2002^2000)%9999 = 9394、2002的平方根的小数点后第10000位是4。 下面这个程序只是我用编写的"天文数字计算"里的一个计算。 因为在程序代码中使用了中文,所以这个程序如果不在中文DOS下运行,可能会出现乱码,但不影响程序的计算结果。 注:因为DOS能访问的内存有限,所以在DOS下可把计算结果扩充到30000多位。但如果用VC把它编绎成Windows程序,则可以计算到"真正的无穷多位"(与机子配置有关),一般计算到几十万位是没有问题的。 /* 此程序在TC2.0、TC3.0,BC,VC下都可编绎 */ #define M 20000 /* 结果位数,DOS能访问的内存有限,不要超过 30000 位*/ #define N (M+5) main() { int Num; reGISter int i,j,k,flag; register unsigned int n,m,pc; unsigned char str_n[5],result_0[N],result_1[N]; void fun_print_result(char *result,int flag); int fun_mul(char *a,char *b,char *c,int flag);

阶乘

阶乘、排列、组合公式计算 ... 附:阶乘、排列、组合公式计算程序 加法原理:做一件事,完成它可以有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)!

高中数学阶乘公式

阶乘(factorial)是基斯顿·卡曼(Christian Kramp, 1760 –1826)于1808年发明的运算符号。阶乘,也是数学里的一种术语。阶乘只有计算方法,没有简便公式的,只能硬算。 例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。例如所要求的数是6,则阶乘式是1×2×3×……×6,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是1×2×3×……×n,设得到的积是x,x就是n的阶乘。 任何大于1的自然数n阶乘表示方法: n!=1×2×3×……×n 或 n!=n×(n-1)! n的双阶乘: 当n为奇数时表示不大于n的所有奇数的乘积 如:7!!=1×3×5×7 当n为偶数时表示不大于n的所有偶数的乘积(除0外) 如:8!!=2×4×6×8 小于0的整数-n的阶乘表示: (-n)!= 1 / (n+1)! 以下列出0至20的阶乘: 0!=1,注意(0的阶乘是存在的) 1!=1, 2!=2, 3!=6, 4!=24, 5!=120, 6!=720, 7!=5,040, 8!=40,320 9!=362,880 10!=3,628,800 11!=39,916,800 12!=479,001,600 13!=6,227,020,800

14!=87,178,291,200 15!=1,307,674,368,000 16!=20,922,789,888,000 17!=355,687,428,096,000 18!=6,402,373,705,728,000 19!=121,645,100,408,832,000 20!=2,432,902,008,176,640,000 另外,数学家定义,0!=1,所以0!=1!

大数阶乘算法

*************************************(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++)

阶乘、矩阵的简单运算

《数学实验》报告 实验名称 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函数,该函数的功能是:从键盘输入一个长整数,如果这个数是负数,则取它的的绝对值,并显示出来。

编写一个计算阶乘的函数fac

1.编写一个计算阶乘的函数fac,在主函数中从键盘输入一个正整数,调用阶乘函数fac 计算阶乘并输出计算结果。 2.编写一个求x的y次幂的函数pw,在main函数中从键盘输入a.b的值,然后调用pw 函数求a的b次幂,并输出结果。 3.写一函数max,计算三个数中最大数。在主函数中输入三个数,调用该函数求出其中最 大数并输出.(要求三个数是实数) 4.写一个函数计算两个正整数的最大公约数,在主函数中用scanf输入m,n两个正整数, 调用函数后,打印函数返回值(即这两个正整数的最大公约数)。 5.编写一个函数,该函数的功能是判断一个整数是不是素数,在main函数中调用该函数, 输出200以内所有的素数。 6.编写一个函数,该函数的功能是判断一个整数是不是素数,在main函数中输入一个整 数,调用该函数,判断该函数是不是素数,若是输出“YES”,若不是输出“NO”. 7.将1—1000中所有21的倍数存到一个一维数组中,再按每行5个数据输出到屏幕上。 8.在屏幕上打印以下图案:(在屏幕上打印以下图案:(要求打印n行,n用符号常量定义 为7) * ** *** 9.输出所有在正整数200和300之间能被6整除、但不能被4整除的数,并统计这样的数 有多少个。 10.求S=1/1+1/2+1/3+……+1/100(精确到小数点后三位)。 11.编写一个程序从键盘输入10个学生的成绩到数组score中,将最高分、最低分输出。 12.在main()函数输入一个人的年龄和性别,女士55岁退休,男士60岁退休。编写一个函 数根据年龄和性别判断一个人是工作还是退休,若工作,则输出“Working”,若退休则输出“retired”。 13.编写一个函数求一个实数的绝对值。然后在main函数中用scanf输入任意个实数,调 用该函数求它的绝对值并输出。 14.编写一求1-n内的偶数和的函数,在main函数中输入n,然后调用该函数求1-n的偶 数和并输出。 15.编写一个函数,将将三个数由小到大的顺序排列并输出,在main函数中输入三个数, 调用该函数完成这三个数的排序。 16.编写一函数,将摄氏温度转换华氏温度,转换公式为:f=1.8*c+32.0。在main函数中调 用该函数,计算并在屏幕上显示从摄氏0度到100度,每隔10度转换一次的华氏温度。 17.编写一个函数,该函数的功能是打印1——n中所有7的倍数,在main函数中输入n, 调用该函数输出结果。 18.编写一个函数判断一个正整数是否为奇数,在主函数中用scanf输入正整数m,调用该 函数后,根据函数返回值判断这个正整数是否为奇数,若是则输出“yes”,若不是则输出” no”。 19.编写一个函数,判断某一个四位数是不是玫瑰花数。在主函数中从键盘任意输入一个四 位数,调用该函数,判断该数是不是玫瑰花数,若是则输出“yes”,若不是则输出”no”。 20.编写一个函数,判断某一个三位数是不是水仙花数。在主函数中调用该函数,输出所有 水仙花数。 21.编写一个函数,函数的功能是求出所有在正整数M和N之间能被5整除但不能被3整 除的数并输出,其中M

计算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则送到进位字单元

高精度计算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

求n的阶乘(用数组表示)

#include void QiuWeiShu(int *pointer,int n) { int WeiShu=0,YuShu=0,Shang=n; do { n=Shang; WeiShu++; *(pointer+WeiShu)=n%10; }while((Shang=n/10)!=0); *pointer=WeiShu; } void main() { /*int n=12; int a[10]={0}; int *p=&a[0]; QiuWeiShu(p,n); for(int i=a[0];i>=1;i--) printf("%d ",a[i]); printf("\n%d\n",a[0]);*///用于测试求位数函数的正确性 int n=121; int ArrChengJi[1000]={0}; int ArrChengJi_WeiShu=0; int ArrChengShu[1000]={0}; int ArrChengShu_WeiShu=0; int temp[1000]={0};//用于存放乘数与每位乘数的和,作为一次乘数;在每位数与每位数相乘时作为乘数的临时变量 int MeiWeiChengJi=0;//用于存放每位与每位之间的的乘积,例如372*371中的第二位与第二位的乘积为7*7=49,然后将49数组化,见下 int ArrMeiWeiChengJi[1000]={0};//每次仅用其中的两位,作为每位与每位之间的的乘积的数组化表示 4 9 int *ArrChengJi_Pointer=&ArrChengJi[0];//指向乘积(ArrChengJi[])的指针,只作为求位数时参数使用 int *ArrChengShu_Pointer=&ArrChengShu[0];//指向乘数(ArrChengShu[])的指针,只作为求位数时参数使用 printf("一开始n的值为:\t%d\n",n);/////////////////////////////////////////////////////////////////////////////// QiuWeiShu(ArrChengJi_Pointer,n);//将n(作为乘积)数组化。数组化值的排序为(654321)ArrChengJi_WeiShu=ArrChengJi[0]; printf("n=%d\t作为初始乘积\n",n );/////////////////////////////////////////////////////////////////////////////// printf("n\t=%d数组化后的位数为:%d\n",n,ArrChengJi_WeiShu);///////////////////////////////////////////////////////////////////////////////

相关主题