如何用Java编程求1到100以内所有整数的阶乘

如何用Java编程求1到100以内所有整数的阶乘

工具:JDK;

Eclipse;

编程求1到100以内整数的阶乘,并打印输出1!+2!+3!+…+100!=

public class test {

//创建一个静态方法;

static int FACT(){

int sum=0;

//对1到100内的数进行循环遍历;

for(int k=1;k<=100;k++){

int result=1;

//求一个数n的阶乘1*2*3*(n-1)*n;

for(int i=1;i<=k;i++){

result=result*i;

}

//累加求和;

sum=sum+result;

}

//获取返回值;

return sum;

}

public static void main(String[] args) {

//控制台打印输出;

System.out.println(”1”+”!”+”2”+”!”+”3”+”!”+…+”100”+”!”+”=”test.FACT()); }

}

计算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,则结果长度要扩展。

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

阶乘的计算及处理程序设计 一、问题描述 要求输入一个自然数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的阶乘c++实验报告

实验五 一、实验内容 1、掌握3种循环结构:while,do-while,for的区别与联系,以及他们之间相互转换的方法,并能正确使用他们. 2,掌握与循环语句相关的break语句和continue语句的使用方法. 二、实验目的 1、掌握3种循环结构:while,do-while,for的区别与联系,以及他们之间相互转换的方法,并能正确使用他们. 2,掌握与循环语句相关的break语句和continue语句的使用方法. 三、实验步骤 实践教程例题1 1.输入正整数n,计算n的阶乘. 2.实践教程例2 输入若干字符,统计其中数字字符.白字符和其它字符的个数,输入EOF结束. 3、实践教程例3 N个人围坐成一圈,从1开始顺序编号;游戏开始,从第一个人开始由1到m循环报数,报到m的人退出圈外,问最后留下的那个人原来的序号。 4`书2.3 设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,80~89为4分,70~79为3分,60~69为两分,60分以下为1分。 书2.5 编译打印如下图形 * * * * * * * * * * * * * * * * * * * * * * * * *

4、书2.7 输入n,求1!+2!+3!+…+n!。 四、实验数据及处理结果 实践教程例1 #include using namespace std; int main (){ int n,i; double result=0; cout<<"请输入正整数:"<>n; if(n<1){ cout<<"输入错误!"<

阶乘排列组合公式计算

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

关于阶乘的程序编写

数的阶乘 很多教材中的阶乘程序只是简单地用了阶乘的定义,算法比较简单,考虑也不够全面,其相应的程序如下: /* 数的阶乘(经典版)*/ #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:

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

用汇编语言计算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

阶乘的因数的个数

给定两个数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阶乘

(一)实验名称 递归程序设计求N阶乘 (二)实验内容和要求 设计一个汇编程序完成y=n!的计算。 要求:(1)能够根据用户输入的n值计算其阶乘,结果以十进制数显示; (2)基于递归程序结构,模块划分合理,具有清晰的入口和出口。(三)实验目的 (1)感受和学习递归程序的设计方法、技巧,完成递归程序设计 (2)学会运用堆栈传递参数的方法和技巧 (3)进一步感受和学习汇编语言程序设计的方法、技巧和调试过程(四)实验日期、时间和地点 时间:2010年11月22日 地点:微机高级实验室 (五)实验环境(说明实验用的软硬件环境及调试软件) 使用masm for windows (六)实验步骤(只写主要操作步骤,要简明扼要,还应该画出程序流程图或实验电路的具体连接图)

(七)实验结果(经调试通过的源程序的所有代码,应包含必要的说明文字)DATAS SEGMENT OPE DW 0,0,0,0 RESULT DB 16 DUP(0),'H',0DH,0AH,0AH,'$' NUM DB 3,0,3 DUP(0) MESS1 DB'Please input N(key Enter to quit):',0DH,0AH,'$' ERR_MESS DB'Error number,try again!',0DH,0AH,0AH,'$' FUNC DB 0,0,'!','=','$' DATAS ENDS STACKS SEGMENT STACK DW 1000 DUP(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS DS_STR MACRO BUF ;显示字符串的宏 PUSH DX PUSH AX LEA DX,BUF MOV AH,09H INT 21H POP AX POP DX ENDM ;—————————————————————————————————— ————

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){

高中数学的阶乘公式大全

高中数学的阶乘公式大全 阶乘(factorial)是基斯顿卡曼(Christian Kramp, 1760 1826)于1808年发明的运算符号。阶乘,也是数学里的一种术语。阶乘只有计算方法,没有简便公式的,只能硬算。以下是小编整理的关于阶乘的相关公式大全,希望能方便大家。 例如所要求的数是4,则阶乘式是1234,得到的积是24,24就是4的阶乘。例如所要求的数是6,则阶乘式是1236,得到的积是720,720就是6的阶乘。例如所要求的数是n,则阶乘式是123n,设得到的积是x,x就是n的阶乘。 任何大于1的自然数n阶乘表示方法: n!=123n 或 n!=n(n-1)! n的双阶乘: 当n为奇数时表示不大于n的所有奇数的乘积 如:7!!=1357 当n为偶数时表示不大于n的所有偶数的乘积(除0外) 如:8!!=2468 小于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!

常用经典算法(整理中)

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;}

汇编--N阶乘

一、实验目的 1. 掌握子程序的设计方法; 2. 掌握递归子程序的设计思想; 3. 体会堆栈操作在子程序嵌套中的重要作用。 二、实验原理及基本技术路线图(方框原理图) 一个子程序作为调用程序去调用另一子程序,这种关系称为子程序嵌套。由于子程序嵌套对堆栈的使用很频繁,因此还要确保堆栈有足够空间,并要注意堆栈的正确状态,这包括CALL、RET、RET N、PUSH、POP、INT、IRET等与堆栈操作有关指令的正确使用。 在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。显然递归调用是子程序嵌套的一种特殊情况。使用递归算法往往能设计出效率较高的程序。 设计递归子程序时,必须保证每一次后继调用都不能破坏它上一次调用时所生成的参数和中间结果,并且该过程不会修改它本身。这就意味着当使用汇编语言设计递归子程序时,必须考虑每一次调用都应该把它的参数、寄存器和所有的中间结果保存到不同的存储区域。最好的办法是利用堆栈来存储这些信息,一次调用所保存的信息称为一帧。递归调用要使用大量的堆栈空间,一定要保证堆栈足够大,而且也要保证堆栈的正确使用,避免死机等不可预料的情况发生。 求N!算法流程图:

三、所用仪器、材料(设备名称、型号、规格等) 1. 操作系统平台:Windows Server 2003 2. 汇编环境:Microsoft MASM 5.0 3. 文本编辑器:记事本 四、实验方法、步骤 1. 将MASM5.0的文件置于C:\assembly\目录下;

2. 将masm.exe和link.exe所在目录(C:\assembly\MASM5)添加到Path环境变量中; 3.在C:\assembly\下新建一个JC.asm文件,打开JC.asm,输入汇编程序代码; 4. 运行一个命令行窗口,将当前目录切换到C:\assembly\,然后输入命令:masm JC.asm [Enter],来汇编程序,根据汇编结果查看程序代码是否有语法错误,如有,则更正保存后重新汇编,直至没有错误为止,此时会生成JC.obj文件; 5. 输入命令:link JC.obj [Enter],观察输出结果,如果没有错误,则生成JC.exe; 6. 输入命令:debug JC.exe [Enter],调试程序,并记录运行过程; 7. 完成实验报告。 五、实验过程原始记录(数据、图表、计算等) 1. 将C:\assembly\MASM5目录添加到Path环境变量中: 2. 新建名为JC.asm的文件,输入汇编程序代码:

大数阶乘算法

*************************************(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!得结果超出了电脑能显示得范围,所以最好采用数组来记录每位*/

相关文档
最新文档