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

求1-20的阶乘和

求1-20的阶乘和
求1-20的阶乘和

/*

* 求1-20的阶乘和

*/

public class test {

public static void main(String args[]) {

long i=1,j,sum=0;

while (i<=20)

{

long s=1;

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

{

s = s*j;

}

i++;

sum=sum+s;

}

System.out.println(sum);

}

}

N阶乘的递归调用展开式

long fact(int n) 1 { 2 long k; 3 if (n<0) 4 { 5 printf( “Data error!\n”); 6 exit(0); 7 } 8 else if (n==0||n==1) k=1; 9 else k=n*fact(n-1); 10 return k; 11 } main() { int n; long f; printf(“Please input an integral number:\n”); scanf(“%d”, &n); f=fact(n); printf(“%d!=%ld\n”, n, f); }

求fact(4)的详解过程, 执行了的语句用红色表示long fact(4) 1 { 2 long k; 3 if (4<0) 4 { 5 printf( “Data error!\n”); 6 exit(0); 7 } 8 else if (4==0||4==1) k=1; 9 else k=4*fact(4-1); /*断点1:调用fact(3)*/ 10 return k; 11 }

long fact(3) 1 { 2 long k; 3 if (3<0) 4 { 5 printf( “Data error!\n”); 6 exit(0); 7 } 8 else if (3==0||3==1) k=1; 9 else k=3*fact(3-1); /*断点2:调用fact(2)*/ 10 return k; 11 }

long fact(2) 1 { 2 long k; 3 if (2<0) 4 { 5 printf( “Data error!\n”); 6 exit(0); 7 } 8 else if (2==0||2==1) k=1; 9 else k=2*fact(2-1); /*断点3:调用fact(1)*/ 10 return k; 11 }

阶乘运算

//阶乘各算法的 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

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

微机原理课程设计报告计算N的阶乘

科技学院 课程设计报告 ( 2012—2013 年度第一学期) 课程:微机原理及应用 题目:计算N的阶乘 院系:动力工程系 班级: 学号: 学生姓名: 指导教师: 设计周数:一周 成绩: 日期:2013年1 月11 日

《微机原理及应用》课程设计 任务书 一、目的与要求 1.通过对微机系统分析和具体设计,使学生加深对所学课程的理解。 2.掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。 3.培养学生分析问题、解决问题的能力。 4.培养学生对微型计算机应用系统的基本设计能力。 5.提高学生的实践动手能力和创新能力。 二、主要内容 设计题目:计算N的阶乘。数值N由键盘输入,N的范围为0~65535,结果在屏幕上显示。 1.针对所选择的设计题目进行硬件设计,合理选用所需元器件,绘制系统结构框图、硬件接线图,并在实验系统上完成电路的连接和调试。 2.根据所选题目的要求对微机系统进行程序设计,绘制程序总体流程图并编写源程序上机调试。 3.写出课程设计报告,对整个设计过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识和收获。 三、进度计划 四、设计成果要求 1.系统硬件设计合理,软件编程达到设计要求。 2.系统硬件结构图和软件流程图绘制清楚规范。 3.设计报告完整规范。 五、考核方式 根据设计任务的完成情况、课程设计报告撰写情况及演示答辩情况采用五级记分制评定成绩。 学生姓名: 指导教师:

一、课程设计目的与要求 1.通过对微机系统分析和具体设计,使学生加深对所学课程的理解。 2.掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。 3.培养学生分析问题、解决问题的能力。 4.培养学生对微型计算机应用系统的基本设计能力。 5.提高学生的实践动手能力和创新能力 二、课程设计正文 1.程序正文 CRLF MACRO MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDM ;回车换行 DATA SEGMENT MESS1 DB ‘INPUT THE NUMBER ACCORDING TO HEXNUM!’,0DH,0AH, ‘$’ MESS2 DB ‘THE RESULT IS:’,0DH,0AH, ‘$’ ERROR DB ‘INPUT ERROR!’,0DH,0AH, ‘$’ LEN DW 1 CYY DW ? BUF DW 256 DUP (0) DATA ENDS STACK SEGMENT STA DW 32 DUP (?) TOP DW ? STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SP,TOP

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之间变化(输出结果从右往左每四个数之间用一个“,”隔开)。然后对程序进行编译,运行,并不断完善细节,不断优化。

阶乘

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

汇编--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的文件,输入汇编程序代码:

计算N地阶乘2(微型计算机原理与接口技术)

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

北华航天工业学院电子工程系 微机原理课程设计任务书 指导教师:刘金梅 2010年12 月 21 日

内容摘要 本次设计以8086CPU为主板进行,主要计算机系统概述,计算机中数据的表示,运算方法与运算器,控制器,Intel80X86微处理器,存储系统,80X86的寻址方式与指令系统及中断系统。说明说在内容组织上既注重全面性和实用性,又强调系统与新颖性。由浅入深,全面系统地介绍了微型计算机的组成、工作原理、接口电路和典型应用等,使读者监理微型计算机系统的整体念,掌握微型计算机系统软硬件开发的初步方法,了解简单计算机应用系统的工作原理和设计方法。 本文是关于微型计算机原理写文件课程设计。编写程序,将内存区域中用调试程序(DEBUG)设置好的一连串数据做为一个文件存入磁盘,文件名为N.ASM。内存区域的段地址和偏移地址在程序中输入 随着计算机的高速发展,微型计算机已经应用到各个领域,微型计算机原理应用技术已经成为电子信息的核心产业。 微型计算机原理是计算机科学与技术、通讯工程、电气工程、机电工程的核心课程。 通过这次课程设计,是我们更好地理解了课程中所学的理论知识,并把实际问题转化为理论知识,学会如何把学到的知识用于解决实际问题,培养我们的动手能力。 索引关键词:键盘输入、屏幕输出、不超过一个16位寄存器的容量

目录 一概述 (5) 二设计内容 (5) 三设计目的 (5) 四设计要求 (5) 五设计思路 (5) 1.编制阶乘程序的难点 (5) 2.算法 (5) 六源程序 (6) 七运行过程 (11) 1.源文件的建立和汇编 (11) 2.目标文件的链接 (12) 3.执行文件的调试 (12) 八 N的阶乘流程图 (12) 九实验体会 (14) 十参考文献 (14)

求某数的阶乘的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++)

n的阶乘汇编语言

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;宏定义 print_str macro x;宏定义输出字符串 lea dx,x mov ah,9 int 21h endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATAS SEGMENT ;此处输入数据段代码 n dw ?;存放该数 flag dw 0;判断是否输入为非数字 str1 db 'input the number:$' str2 db '!=$' str3 db 0ah,0dh,'again?(enter means stop,others means continue):$' str4 db '-------------------------------the max num is 8!--------------------------------',0ah,0dh,'$' error db 0ah,0dh,'not a num!$' enter1 db 0ah,0dh,'$' DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 dw 20 dup(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 print_str str4 begin1: print_str str1 call input;将输入的数赋给n cmp flag,0 jne again1 mov dx,0 mov ax,n call output print_str str2 mov dx,0 mov ax,1 mov bx,n

计算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);///////////////////////////////////////////////////////////////////////////////

递归求n的阶乘

#include #define N 6 void MatrixChain(int p[N+1], int n, int m[N+1][N+1], int s[N+1][N+1]) { int i,j,r,k,t; for(i=1;i<=n;i++)m[i][i]=0; for(r=2;r<=n;r++) for(i=1;i<=n-r+1;i++) { j=i+r-1; m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for(k=i+1;k

相关文档