n的阶乘程序报告
C语言实现N阶乘的程序代码
//各个下标的阶乘,第0位下标是位数,所以从第1位开始 for (j = 1; j <= ary[0]; j++) {
ary[j] = ary[j] * i; } //处理进位问题 1W就进一位 for (j = 1; j <= ary[0]; j++) {
if (ary[j] >= 10000) {
//进位 ary[j+1] = ary[j+1] + ary[j] / 10000; //进位后就只留下余数 ary[j] = ary[j] % 1/这里j已经是位数大于1了 if (ary[j] >= 1) { ary[0]++; } }
这篇文章主要给大家介绍了关于如何在c中实现字符串分割函数split的相关资料文中通过示例代码介绍的非常详细对大家学习或者使用c具有一定的参考学习价值需要的朋友们下面来一起学习学习吧
C语言实现 N阶乘的程序代码
代码如下所示:
复制代码 代码如下:
#include <stdio.h> #include <stdlib.h> #define N 10 //算N的阶乘 int main() { //数组 1位 1!
//倒序输出 for (j = ary[0]; j > 0; j--) {
printf("%d", ary[j]); } printf("\r\n"); return 0; }
求阶乘之实验报告
一、实验目的1. 理解阶乘的概念。
2. 掌握阶乘的计算方法。
3. 通过编程实现阶乘的计算。
二、实验原理阶乘(Factorial)是指一个正整数n的阶乘,记作n!,定义为从1乘到n的所有正整数的乘积。
即:n! = n × (n-1) × (n-2) × ... × 2 × 1当n=0时,0的阶乘定义为1,即0! = 1。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.8.53. 编辑器:PyCharm四、实验步骤1. 设计一个函数,用于计算阶乘。
2. 通过用户输入,获取需要计算的阶乘数。
3. 调用函数,计算阶乘结果。
4. 输出阶乘结果。
五、实验代码```pythondef factorial(n):if n == 0:return 1else:return n factorial(n-1)# 获取用户输入num = int(input("请输入一个正整数:"))# 计算阶乘result = factorial(num)# 输出结果print(f"{num}的阶乘为:{result}")```六、实验结果与分析1. 当输入0时,程序输出结果为1,符合0的阶乘定义。
2. 当输入1时,程序输出结果为1,符合1的阶乘定义。
3. 当输入一个大于1的正整数时,程序能够正确计算出阶乘结果。
七、实验总结1. 通过本次实验,我们了解了阶乘的概念和计算方法。
2. 我们掌握了使用递归函数实现阶乘计算的方法。
3. 实验过程中,我们遇到了一些问题,如递归深度过大导致程序崩溃等,通过查阅资料和调试代码,成功解决了这些问题。
八、实验拓展1. 可以尝试使用循环结构实现阶乘计算。
2. 可以编写一个函数,用于计算任意正整数的阶乘。
3. 可以研究阶乘在数学、物理、计算机科学等领域的应用。
输入正整数n,计算n的阶乘c++实验报告
输⼊正整数n,计算n的阶乘c++实验报告实验五⼀、实验内容1、掌握3种循环结构:while,do-while,for的区别与联系,以及他们之间相互转换的⽅法,并能正确使⽤他们.2,掌握与循环语句相关的break语句和continue语句的使⽤⽅法.⼆、实验⽬的1、掌握3种循环结构:while,do-while,for的区别与联系,以及他们之间相互转换的⽅法,并能正确使⽤他们.2,掌握与循环语句相关的break语句和continue语句的使⽤⽅法.三、实验步骤实践教程例题11.输⼊正整数n,计算n的阶乘.2.实践教程例2输⼊若⼲字符,统计其中数字字符.⽩字符和其它字符的个数,输⼊EOF结束.3、实践教程例3N个⼈围坐成⼀圈,从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#includeusing namespace std;int main (){double result=0;cout<<"请输⼊正整数:"<cin>>n;if(n<1){cout<<"输⼊错误!"<return 1;}result=1;for(i=2;i<=n;i++)result*=i;cout<return 0;}实践教程例2#includeusing namespace std;int main(){int c;int nWhite,nOther,nDigit;nWhite=nOther=nDigit=0;c=cin.get();while(c!=EOF){switch(c){case'0':case'1':case'2':case'3':case'4': case'5':case'6':case'7':case'8':case'9': nDigit++;break;case' ':case'\n':case'\t':nWhite++;break;default:nOther++;break;}}cout<<"digits="<<'\t'<cout<<"White space="<<'\t'<cout<<"Other Chars="<<'\t'<return 0;}实践教程例3#includeusing namespace std;int main(){const int n=4;const int m=2;char jose[n];int i,j=0,k;for(i=0;ifor(k=n;k>=1;k--){i=0;while(i!=m){if(jose[j]==1){i++;if(i==m){jose[j]=0;}}}j=(j+1)/n;}cout<<"The one left at last is "<<(j-1)< return 0;}书2.3#includeusing namespace std;int mark,result;cout<<"??ê?è?°ù·3é?¨:"<cin>>mark;if(mark<0){cout<<"è±??"<return 0;}switch(mark/10){case 9:case 10:result =5;cout<<"ê?3·3é?¨£o"<break;case 8:result=4;cout<<"ê?3·3é?¨:"<break;case 7:result=3;cout<<"ê?3·3é?¨:"<break;case 6:result=2;cout<<"ê?3·3é?¨:"<break;case 5:case 4:case 3:case 2:case 1:case 0: result=0;cout<<"ê?3·3é?¨:"<break;default:cout<<"ê?è?′í?ó!"<}return 0;}#includeusing namespace std;int main(){int i,j;for(i=1;i<=4;i++){for(j=4-i;j>0;j--)cout<<" ";for(j=1;j<=2*i-1;j++)cout<<"*";cout<< endl;}for(i=1;i<=3;i++)cout<<" ***\n";return 0;}书2.7#includeusing namespace std;int main(){int n,i,jch=1;double result=0;cout<<"请输⼊正整数n:"<cin>>n;if(n<1){cout<<"输⼊错误!"<return 1;}result=1;for(i=2;i<=n;i++){jch*=i;result+=jch;}cout<return 0;五、思考讨论题或体会或对改进实验的建议什么时候需要使⽤,怎样正确的使⽤?。
东南大学虚拟仪器实验报告-(计算n!,计算器)
东南大学生物科学与医学工程学院虚拟仪器实验报告第二次实验实验名称:程序结构专业:生物医学工程姓名:学号:同组人员:学号:实验室: 综合楼716实验时间:10月14日评定成绩:审阅教师:一、计算n的阶乘 (3)1实验题目 (3)2实验目的 (3)3实验内容 (3)4设计方案选择、方案的优缺点。
(3)5软件设计: (3)6调试: (6)7测试结果和分析。
(6)8使用说明: (7)9结束语、总结、心得体会。
(7)二、实现加减乘除的计算器 (7)1实验题目 (7)2实验目的 (7)3实验内容 (7)4设计方案选择、方案的优缺点。
(7)5软件设计: (8)6调试: (9)7测试结果和分析 (10)8使用说明: (10)9结束语、总结、心得体会。
(10)一、计算n的阶乘1实验题目完成计算n的阶乘2实验目的①前面板数字控制器可随意输入n的值,并能显示结果(注:0!=1)。
②For循环中重复时间不少于100ms(即程序每100ms循环一次)。
3实验内容⑴学习while、For循环的使用方法。
⑵学习移位寄存器的概念,学习移位寄存器的使用。
⑶学习使用Case结构,学习添加和删除分支。
4设计方案选择、方案的优缺点。
计算n的阶乘的计算器方案选择:利用循环语句,进行数字n的阶乘运算,利用移位寄存器实现数据的传送完成数字连乘。
利用时间计时器的差值得出程序运行所用时间。
能够简洁明了的实现计算n的阶乘的功能,数据正确。
5软件设计:虚拟仪器设计步骤详细介绍。
(1)程序前面板设计:数值输入控件:名称:输入n 属性:双精度(DBL)用途:面向用户,手动输入n值数值显示控件:名称:n!的值属性:双精度(DBL)用途:显示n!运算结果名称:运行时间(ms)属性:双精度(DBL)用途:显示程序运行时间面板的布局:。
(2)框图程序设计:程序流程图:源程序:6调试:调试步骤:使用高亮执行该段程序,观察数据流的动向。
调试中问题:一开始使用整型,对于较小数值,结算结果正确,但对于较大的数值计算结果错误。
微机课设报告(计算N的阶乘)
目录一、实验要求.......................... . (3)二、实验内容 (3)三、实验思路 (3)四、实验过程 (5)五、实验总结 (12)一、实验要求实验目的(1)、堆栈传递参数的子程序调用方法。
(2)、序递归调用方法。
(3)、伪指令:PROC,ENDP,NEAR和FAR。
(4)、指令:CALL,RET,RET n。
(5)、T指令推出EXE文件的方法。
(6)、了解怎样在汇编语言一级上实现高级语言中的数学函数。
二、实验内容1、实验内容计算N!:编写计算N阶乘的程序,数值N由键盘输入,N的值要在0到65536之间(用一个16位的字表示),结果在显示器上显示。
2、实验步骤(1)、打开开始菜单,单击运行,在对话框中输入“cmd”,进入dos窗口。
(2)、输入cd\masm5 回车,在输入edit 回车,进入汇编窗口。
(3)、输入代码。
(4)、保存代码,后缀名为.asm。
(5)、回到dos窗口,输入masm文件名保存位置,文件名回车。
(6)、调试程序,根据提示回到汇编窗口,对代码进行修改,直至出现no error及no warrings。
三、实验思路、1、算法阶乘的定义为N!=N*(N-1)*(N-2)*……2*1,从走往右翼此计算,解雇保留在缓冲区BUF中。
缓冲区BUF按由低到高依次排列。
程序首先将BP初始为N,N 不等于0获1则将N送入BUF缓冲区最低自单元中。
然后使BP一次减1,直至变化到1为止。
每次让BP与BUF的字单元按照由低到高的次序香橙。
低位结果AX仍保存在相应的BUF自单元中,高位结果DX泽送到进位子单元CY 中,作为高字香橙时从低字来的进位,初始化CY为0。
计算结果的长度随着成绩运算而不断增长,由字单元LEN指示,LEN单元初始化为1。
当最高字单元与BP香橙时,若DX不为0,则结果长度要扩展。
2、流程图四、实验过程1、源程序CRLF MACRO ;回车,换行MOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDATA SEGMENTMESS1 DB 'INPUT THE NUMBER ACCORDING TO HEXNUM!',0DH,0AH,'$' MESS2 DB 'THE RESULT IS:$'ERROR DB 'INPUT ERROR!INPUT ONCE MORE!',0DH,0AH,'$'LEN DW 1CY DW ?BUF DW 256 DUP(0)DATA ENDSSTACK SEGMENT STACK 'STACK'DW 32 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV AH,09HMOV DX,OFFSET MESS1INT 21H ;显示输入提示信息CALL GETNUM ;读取键入的N值MOV BP,DX ;N值送BPCMP BP,0JZ EEECMP BP,1JZ EEE ;N=0或N=1则转EEEMOV SI,OFFSET BUF ;缓冲区首址MOV [SI],DXXXX: DEC BP ;N值减1CMP BP,0001HJZ LLL ;若为1则转LLLXOR BX,BX ;偏移指针清0MOV WORD PTR CY,0 ;进位单元清0MOV CX,LEN ;当前结果长度送CXTTT: MOV AX,[SI+BX]MUL BP ;相乘ADD AX,CY ;加低位进位JNC JJJ ;结果无进位转JJJINC DX ;有进位将高位单元加1 JJJ: MOV [SI+BX],AX ;结果送缓冲区中MOV CY,DX ;高位单元送进位单元INC BXINC BX ;一个字长度LOOP TTT ;循环CMP DX,0000HJZ BBB ;最后一次的进位为0则转BBB INC WORD PTR LEN ;长度加1MOV [SI+BX],DX ;进位送缓冲区中BBB: JMP XXXEEE: MOV SI,OFFSET BUFMOV WORD PTR b[SI],1 ;结果为1LLL: MOV AH,09HMOV DX,OFFSET MESS2INT 21H ;显示表头MOV CX,LENMOV BX,CX ;长度DEC BXSHL BX,1 ;一个字为两个字节CCC: MOV AX,[SI+BX]CALL DISPDEC BXDEC BX ;显示结果LOOP CCCMOV AX,4C00H ;结束INT 21HDISP1 PROC NEAR ;显示字符(AL)MOV BL,ALMOV DL,BLMOV CL,04ROL DL,CLAND DL,0FHCALL DISPL ;显示高位MOV DL,BLAND DL,0FHCALL DISPL ;显示低位RETDISP1 ENDPDISPL PROC NEAR ;显示一位(DL=0XH)CMP DL,3AHJB DDDADD DL,27HDDD: MOV AH,02HINT 21HRETDISPL ENDPDISP PROC NEAR ;显示4位数(HEC) PUSH BXPUSH CXPUSH DXPUSH AXMOV AL,AHCALL DISP1POP AXCALL DISP1POP DXPOP CXPOP BXRETDISP ENDPGETNUM PROC NEAR ;字符匹配程序PUSH CXREGET:XOR DX,DXGGG: MOV AH,01HINT 21HCMP AL,0DHJZ PPPCMP AL,20HJZ PPPSUB AL,30HJB KKKCMP AL,0AHJB GETSCMP AL,11HJB KKKSUB AL,07HCMP AL,0FHJBE GETSCMP AL,2AHJB KKKCMP AL,2FHJA KKKGETS: MOV CL,04HSHL DX,CLXOR AH,AHADD DX,AXJMP GGGKKK: CRLFMOV AH,09HMOV DX,0FFSET ERROR INT 21HJMP REGETPPP: PUSH DXCRLFPOP DXPOP CXRETGETNUM ENDPCODE ENDSEND START2、测试结果输入程序把程序都输入进去后,进行调试,直至出现0个错误和0个警告!调试完程序之后,输入LINK,对程序进行编译。
用汇编语言计算N阶乘(0到FFFFH)
用汇编语言计算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 segmentinput1 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 endsdata2 segmentstr3 dw 7fffh dup(?) ;N!乘积的值(2)data2 endscode segmentassume cs:code,ds:data1,es:data2org 100h ;程序从偏移地址100h开始执行start: mov ax,data1 ;程序初始化mov ds,axmov ax,data2mov es,ax ;初始化结束mov ah,9lea dx,input1int 21hmov ah,2 ;回车mov dl,0dhint 21hmov ah,2 ;换行mov dl,0ahint 21hmov ah,0ah ;输入所需求的N值(N为16进制数)lea dx,input2int 21hmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hlea bx,input2mov al,[bx+1] ;判断输入的N值是否超过FFFFH cmp al,4ja s1mov cl,4 ;把输入的N值有ASCH码转成16进制数mov ah,[bx+2]mov al,[bx+3]cmp al,39hja abc1def1: shl al,clcmp ah,39hja abc2def2: shr ax,clmov dh,almov ah,[bx+4]mov al,[bx+5]cmp al,39hja abc3mov cl,4def3: shl al,clcmp ah,39hja abc4def4: shr ax,clmov dl,al ;转换结束mov ax,dx ;判断N值是否为0cmp ax,0jz s2jmp s3abc1: sub al,37hjmp def1abc2: sub ah,37hjmp def2abc3: sub al,37hjmp def3abc4: sub ah,37hjmp def4s1: mov ah,9 ;若N值超过FFFFH的输出lea dx,errorint 21hjmp nexts2: mov ah,9 ;N值为1的输出lea dx,output1int 21hjmp nexts3: mov cx,ax ;计算N的阶乘mov ax,1mov [str1],ax ;N从1开始,作为乘数lea si,str2mov [si],ax ;N!的积从1开始,作为被乘数mov ax,0mov [p],ax ;(n-1)!的乘积的低16位与n相乘后积的高16位mov bx,1 ;开始N!的乘积占一个字空间mov WORD ptr[p+10],0 ;(n-1)!的乘积的高16位与n相乘后积的低16位和(n-1)!的乘积的低16位与n相乘后积的高16位的和的进位,初始进位为0 mov ah,9lea dx,output2int 21hmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hlop2: mov [p+2],bxlop3: mov ax,[si] ;(n-1)!的乘积从最低16位的内容与n相乘mov dx,[str1]mul dxclcadd ax,[p+10] ;前一次的进位与当前乘积的低16位内容相加jnc k1 ;判断是否产生进位mov WORD ptr[p+10],1add ax,[p] ;前一个积的高16位与现在积的低16位相加jmp k2k1: add ax,[p]jnc k3 ;判断是否产生进位mov WORD ptr[p+10],1jmp k2k3: mov WORD ptr[p+10],0k2: mov [si],axmov [p],dxadd si,2dec bxcmp bx,0jnz lop3mov bx,[p+2]clcadd dx,[p+10]cmp dx,0jz re ;判断(n-1)!乘积的最高16位内容与n的乘积的高16位是否为0inc bxmov [si],dxre: mov ax,[str1]cmp ax,9000h ;判断是N!乘积的内容高位部分是否要存到es 中jnc re1jmp re2re1: cmp cx,1ja s4re2: inc WORD ptr[str1] ;乘数增1lea si,str2mov WORD ptr[p],0mov WORD ptr[p+10],0loop lop2dec bxmov cx,bxlop4: add si,2loop lop4inc bxadd bx,bxinc sijmp lop5s4: inc WORD ptr[str1] ;若N的值超过8000h,8000h*8001h*8002h*N mov [p+6],bxmov [p+8],bxlea si,str2lea di,str3mov es:[di],dxmov WORD ptr[p],0mov WORD ptr[p+10],0mov bx,1dec cxlop6: mov [p+4],bxlop7: mov ax,[si]mov dx,[str1]mul dxclcadd ax,[p+10]jnc k4mov WORD ptr[p+10],1add ax,[p]jmp k5k4: add ax,[p] ;前一个积的高16位与现在积的低16位相加,产生进位jnc k6mov WORD ptr[p+10],1jmp k5k6: mov WORD ptr[p+10],0k5: mov [si],axadd si,2mov [p],dxdec WORD ptr[p+6]mov ax,[p+6]cmp ax,0jnz lop7mov ax,[p+8]mov [p+6],axlop8: mov ax,es:[di]mov dx,[str1]mul dxclcadd ax,[p+10]jnc k7mov WORD ptr[p+10],1add ax,[p]jmp k8k7: add ax,[p] ;前一个积的高16位与现在积的低16位相加,产生进位jnc k9mov WORD ptr[p+10],1 jmp k8k9: mov WORD ptr[p+10],0 k8: mov es:[di],axadd di,2mov [p],dxdec bxcmp bx,0jnz lop8mov bx,[p+4]clcadd dx,[p+10]cmp dx,0jz re4inc bxmov es:[di],dxre4: inc WORD ptr[str1] lea si,str2lea di,str3mov WORD ptr[p],0mov WORD ptr[p+10],0 dec cxcmp cx,0jnz lop6dec bxmov cx,bxlop9: add di,2loop lop9inc bxinc dilop10: dec bx ;若N>8000h,输出N!乘积的高位内容mov al,BYTE ptr es:[di]mov ch,almov cl,4shr al,clcmp al,09hja op3add al,30hjmp ip3op3: add al,37hip3: mov ah,2mov dl,alint 21hmov al,chand al,0fhcmp al,09hja op4add al,30hjmp ip4op4: add al,37hip4: mov ah,2mov dl,alint 21hdec dicmp bx,0jnz lop10mov bx,[p+6]dec bxmov cx,bxlop11: add si,2loop lop11inc bxadd bx,bxinc silop5: dec bx ;输出N!的乘积mov al,BYTE ptr [si]mov ch,almov cl,4cmp al,09hja op1add al,30hjmp ip1op1: add al,37hip1: mov ah,2mov dl,alint 21hmov al,chand al,0fhcmp al,09hja op2add al,30hjmp ip2op2: add al,37hip2: mov ah,2mov dl,alint 21hdec sicmp bx,0jnz lop5next: mov ah,1int 21hmov ah,4chint 21hcode endsend start六、程序运行结果与分析若输入的16进制数N为000A(10进制为10),程序运行后输出的N!应为375F00(H)。
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之间变化(输出结果从右往左每四个数之间用一个“ ,”隔开)。
然后对程序进行编译,运行,并不断完善细节,不断优化。
第三部分设计方案(一)设计分析1、解决结果的存放问题由于是求一个大数n的阶乘,结果的很大(会溢出),无法直接输出或得到结果,所以在经过探索及请教同学之后拟定用乘法的基本原理把用户给的数据求得阶乘后的结果的个、十、百、千...位依次赋数给数组a[200] ——即a[0] =个位上的数,a[1] =十位上的数 .....以此类推。
阶乘设计实验报告
阶乘设计实验报告一.问题描述输入一个自然数n,求!n,同时统计结果中有多少个0。
即编写一个输入整数n,计算并输出阶乘和结果中0的个数的程序。
二.课题分析1.首先要输入自然数n,算出n的阶乘。
分析:由于n!=1*2*3*…*n,因此采用累乘的方法,用变量S(累乘器)来存放累计乘机(初值=1),用变量i来存放乘数(即被乘的数),i=1,2,3,,,,,n,接收到n后计算n!。
2.统计结果中有多少个0分析:在text1中得到自然数n阶乘的结果,运用字符串函数统计其0的个数。
设计中运用到len(x)和min(x,m,n)函数。
用len(x)计算text1中字符串所含字符的个数,mid(x)从字符串s(text1.text=s)的第m个字符开始截取n个字符,令Mid(Text1.Text, t, 1) = "0",d为累加器,每运行一次程序,执行d=d+1。
当t截取到最后一个为0的字符串时,退出循环。
3.疑问:·输入数据n时判断是否为自然数,vb语言如何编写判断自然数的程序?·N是否有范围限制,可以无限放大吗?4.程序设计基本步骤如下:(1)建立用户界面和对象属性在窗体上建立2个文本框,5个标签和1个命令按钮。
各对象的主要属性(思考如何排列设计能使界面看上去简单整洁)(2)编写事件代码注意事项:·声明变量,选择合适的数据类型。
·输入数据的方式,text和inputbox都可以,根据情况再做考虑。
·循环结构的使用,考虑for…next循环,注意结构的完整性,不要漏掉结束语句,嵌套结构尤其注意。
·统计结果中0的个数时,可以用字符串函数,考虑left(x),Right(x),mid(x,m,n),len(x),哪种方法可以完成运算。
·累乘法,累加法的使用。
三.流程图四.相关运行界面五.调试记录:第一次调试:出现实时错误,如图所示我原先声明s as long,用的数据类型是长整型,最大不超过2 147 483 647,而13的阶乘是6 227 020 800,超过long(长整型)数据类型的范围。
计算机组成原理实验报告 N的阶乘
《计算机组成原理》课程设计报告课程设计题目:N的阶乘班级:姓名:学号:完成日期:2013/10/18一、课程设计步骤1、计算机的功能和用途:实现n!=n*n-1*n-2*..*2*1的功能2、程序设计目的(1)在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本模型计算机。
(2)使用简单模型机和复杂模型机的部分机器指令,并编写相应的微程序,具体上机调试掌握整机概念。
(3)掌握微程序控制器的组成原理。
(4)掌握微程序的编写、写入,观察微程序的运行。
(5)通过课程设计,使学生将掌握的计算机组成基本理论应用于实践中,在实际操作中加深对计算机各部件的组成和工作原理的理解,掌握微程序计算机中指令和微指令的编码方法,深入理解机器指令在计算机中的运行过程。
3、程序设计基本原理(1)实验模型机结构[1] 运算器单元(ALU UINT)运算器单元由以下部分构成:两片74LS181构成了并-串型8位ALU;两个8位寄存器DR1和DR2为暂存工作寄存器,保存参数或中间运算结果。
ALU的S0~S3为运算控制端,Cn为最低进位输入,M为状态控制端。
ALU的输出通过三态门74LS245连到数据总线上,由ALU-B控制该三态门。
[2] 寄存器堆单元(REG UNIT)该部分由3片8位寄存器R0、R1、R2组成,它们用来保存操作数用中间运算结构等。
三个寄存器的输入输出均以连入数据总线,由LDRi和RS-B根据机器指令进行选通。
[3] 指令寄存器单元(INS UNIT)指令寄存器单元中指令寄存器(IR)构成模型机时用它作为指令译码电路的输入,实现程序的跳转,由LDIR控制其选通。
[4] 时序电路单元(STA TE UNIT)用于输出连续或单个方波信号,来控制机器的运行。
[5] 微控器电路单元(MICRO-CONTROLLER UNIT)微控器主要用来完成接受机器指令译码器送来的代码,使控制转向相应机器指令对应的首条微代码程序,对该条机器指令的功能进行解释或执行的工作。
c语言中n的阶乘
c语言中n的阶乘n的阶乘是指从1乘到n的连续整数相乘的结果,用符号n!表示。
在C语言中,计算n的阶乘可以通过循环来实现。
阶乘的计算涉及到很多数学知识,但在本文中,我们将着重介绍如何在C语言中编写程序来计算n的阶乘。
我们需要声明一个整型变量n,并从用户那里获取输入。
在C语言中,可以使用scanf函数来实现输入操作。
然后,我们需要判断用户输入的值是否合法,即n是否为非负整数。
如果用户输入的是负数或者非整数,我们需要提示用户重新输入。
可以使用if语句来实现这一逻辑。
接下来,我们需要使用循环来计算n的阶乘。
我们可以声明一个变量result,并将其初始化为1。
然后,使用for循环来进行连续相乘的操作。
循环的次数从1到n,每次将result与循环变量i相乘,并将结果赋值给result。
这样,当循环结束时,result的值就是n 的阶乘。
我们需要输出计算结果。
可以使用printf函数来实现输出操作。
输出时,可以使用占位符%s来输出n的阶乘结果。
同时,为了使输出结果更加美观,可以在输出前加入一些文字描述,例如"n的阶乘为:"。
下面是一个示例代码:```c#include <stdio.h>int main() {int n;printf("请输入一个非负整数n:");scanf("%d", &n);// 判断n是否为非负整数if (n < 0) {printf("输入不合法,请重新输入一个非负整数n。
\n"); return 0;}int result = 1;for (int i = 1; i <= n; i++) {result *= i;}printf("n的阶乘为:%d\n", result);return 0;}```以上就是使用C语言计算n的阶乘的方法。
通过合理的逻辑和代码实现,我们可以方便地得到n的阶乘结果。
输入正整数n,计算n的阶乘c++实验报告
while(c!=EOF){
switch(c){
case'0':case'1':case'2':case'3':case'4':
case'5':case'6':case'7':case'8':case'9':
nDigit++;
break;
case' ':case'\n':case'\t':
break;
default:
cout<<"ÊäÈë´íÎó!"<<endl;
}
return 0;
}
书2.5
#include<iostream>
using namespace std;
int main(){
int i,j;
for(i=1;i<=4;i++){
for(j=4-i;j>0;j--)cout<<" ";
nWhite++;
break;
default:
nOther++;
break;
}
c=cin.get();
}
cout<<"digits="<<'\t'<<nDigit<<'\n';
cout<<"White space="<<'\t'<<nWhite<<'\n';
阶乘算法实验报告
一、实验背景阶乘(Factorial)是数学中一个重要的概念,它表示一个正整数n的所有正整数乘积。
用数学符号表示为n!,其中n为正整数。
阶乘在数学、物理、计算机科学等领域都有广泛的应用。
本实验旨在研究阶乘算法,通过编写程序计算给定正整数的阶乘。
二、实验目的1. 了解阶乘的定义和性质;2. 掌握阶乘算法的编写方法;3. 比较不同阶乘算法的效率;4. 分析阶乘算法在实际应用中的优缺点。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm四、实验内容1. 阶乘算法的基本原理阶乘算法的核心思想是递归或循环。
递归方法利用函数自身调用实现阶乘的计算,而循环方法则通过循环结构实现。
2. 阶乘算法的编写(1)递归方法```pythondef factorial_recursive(n):if n == 0:return 1else:return n factorial_recursive(n-1)```(2)循环方法```pythondef factorial_loop(n):result = 1for i in range(1, n+1):result = ireturn result```3. 不同阶乘算法的效率比较为了比较递归方法和循环方法的效率,我们可以通过计算不同输入值下两种方法的执行时间。
```pythonimport timedef test_factorial_method(method, n):start_time = time.time()result = method(n)end_time = time.time()return end_time - start_time# 测试数据n_values = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]# 比较递归方法和循环方法的效率recursive_time = [test_factorial_method(factorial_recursive, n) for n in n_values]loop_time = [test_factorial_method(factorial_loop, n) for n in n_values]print("递归方法执行时间:")print(recursive_time)print("循环方法执行时间:")print(loop_time)```4. 阶乘算法在实际应用中的优缺点分析阶乘算法在实际应用中具有以下优缺点:优点:(1)易于理解和实现;(2)能够计算较大正整数的阶乘;(3)在数学、物理、计算机科学等领域有广泛的应用。
汇编--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. 完成实验报告。
c语言用递归法计算n的阶乘
c语言用递归法计算n的阶乘
在C语言中,可以使用递归法来计算一个数的阶乘。
例如,要计算n的阶乘,可以使用以下代码:
```c
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1; // 0的阶乘为1
} else {
return n * factorial(n - 1); // 递归调用
}
}
int main() {
int n;
printf('输入一个整数:');
scanf('%d', &n);
printf('%d的阶乘为:%d', n, factorial(n));
return 0;
}
```
在这个代码中,我们定义了一个函数`factorial`,它接受一个整数参数n,返回n的阶乘。
如果n为0,则返回1(因为0的阶乘
为1)。
否则,递归调用`factorial`函数,传入n-1作为参数,并将其乘以n后返回。
在`main`函数中,我们首先读取一个整数n,并将其传入
`factorial`函数中计算阶乘。
最后,我们输出n的阶乘的值。
这种方法的优点是代码简单易懂,但当n很大时会导致栈溢出。
因此,在实际编程中要注意选择合适的算法来计算阶乘。
n的阶乘程序设计
n的阶乘程序设计n的阶乘是一个在计算机编程中常见的问题,它指的是一个正整数n的连乘积,通常表示为n!。
例如,5! = 5 × 4 × 3 × 2 × 1 = 120。
阶乘程序设计可以采用多种不同的方法,包括递归、迭代、尾递归优化等。
下面将详细介绍几种常见的阶乘程序设计方法。
1. 迭代法迭代法是一种使用循环来计算阶乘的方法。
它从1开始,逐步乘以2、3、...直到n。
这种方法的优点是简单易懂,且在计算过程中不需要额外的内存空间。
```pythondef factorial_iterative(n):result = 1for i in range(1, n + 1):result *= ireturn result```2. 递归法递归法是一种通过函数自我调用来解决问题的方法。
在阶乘问题中,递归函数可以定义为`n! = n * (n-1)!`,当n为1时,递归终止。
```pythondef factorial_recursive(n):if n == 1:return 1else:return n * factorial_recursive(n - 1)```递归方法虽然简洁,但当n较大时,可能会导致栈溢出错误。
3. 尾递归优化尾递归是一种特殊的递归形式,它可以被编译器优化以减少内存使用。
在尾递归中,递归调用是函数体中的最后一个操作。
```pythondef factorial_tail_recursive(n, accumulator=1):if n == 1:return accumulatorelse:return factorial_tail_recursive(n - 1, n * accumulator)```尾递归优化可以减少递归调用的内存消耗,但并非所有编译器都支持这种优化。
4. 动态规划动态规划是一种通过存储中间结果来避免重复计算的方法。
在阶乘问题中,可以预先计算较小的阶乘值,并用它们来构建较大的阶乘值。
n的阶乘
C语言程序设计实验报告
1实验目的
(1)熟练函数的定义方法、调用方法、参数说明以及返回值;
(2)掌握实参与形参的对应关系,以及参数之间的“值传递”的方式;
(3)掌握函数的嵌套调用及递归调用的设计方法;
(4)在编程过程中加深理解函数调用的程序设计思想。
2实验内容
(1)编写一个求任意正整数n的阶乘的函数;
(2)编写整个程序;
(3)用scanf函数输入n的值;
(4)输出n的阶乘的值。
3算法描述流程图
4源程序
5测试数据
6,8,12
6运行结果
当输入数据为6时:
当输入数据为8时:
当输入数据为12时:
7出现问题及解决方法
忽略了n=0时的情况,将n=0和n=1单独列出来,直接给出阶乘的值。
8实验心得
能熟练的定义一个新的函数来实现程序的简化和执行,学会了编程计算n的阶乘的方法。
递归程序设计 求N阶乘
(一)实验名称递归程序设计求N阶乘(二)实验内容和要求设计一个汇编程序完成y=n!的计算。
要求:(1)能够根据用户输入的n值计算其阶乘,结果以十进制数显示;(2)基于递归程序结构,模块划分合理,具有清晰的入口和出口。
(三)实验目的(1)感受和学习递归程序的设计方法、技巧,完成递归程序设计(2)学会运用堆栈传递参数的方法和技巧(3)进一步感受和学习汇编语言程序设计的方法、技巧和调试过程(四)实验日期、时间和地点时间:2010年11月22日地点:微机高级实验室(五)实验环境(说明实验用的软硬件环境及调试软件)使用masm for windows(六)实验步骤(只写主要操作步骤,要简明扼要,还应该画出程序流程图或实验电路的具体连接图)(七)实验结果(经调试通过的源程序的所有代码,应包含必要的说明文字)DATAS SEGMENTOPE DW 0,0,0,0RESULT 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 ENDSSTACKS SEGMENT STACKDW 1000 DUP(?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSDS_STR MACRO BUF ;显示字符串的宏PUSH DXPUSH AXLEA DX,BUFMOV AH,09HINT 21HPOP AXPOP DXENDM ;——————————————————————————————————————SR_STR MACRO BUF;输入字符串的宏PUSH DXPUSH AXLEA DX,BUFMOV AH,0AHINT 21HPOP AXPOP DXENDM ;——————————————————————————————————————START:MOV AX,DATASMOV DS,AXMOV ES,AXLOP1:MOV CX,16;对RESULT清零LEA DI,RESULTMOV AL,0REP STOSBMOV CX,4;对OPE清零LEA DI,OPEMOV AX,0REP STOSWDS_STR MESS1;显示提示信息SR_STR NUM;输入NMOV DL,0AH;输出换行MOV AH,2HINT 21HCMP [NUM+1],0;直接回车则退出JZ OVERCMP [NUM+1],1JNZ LABEL_2CMP [NUM+2],'1';输入一位数,是1~9,则继续,否则输出错误信息,并跳转到开始JB ERR_NUMCMP [NUM+2],'9'JA ERR_NUMMOV BL,[NUM+2];把输入的ASCII码转换成数字存入BX中SUB BL,30HMOV BH,0JMP GO_ONLABEL_2:CMP [NUM+2],'1';输入二位数,是10~99,则继续,否则输出错误信息, JB ERR_NUMCMP [NUM+2],'9'JA ERR_NUMCMP [NUM+3],'0'JB ERR_NUMCMP [NUM+3],'9'JA ERR_NUMMOV AL,[NUM+2];把输入的ASCII码转换成数字存入BX中SUB AL,30HMOV BL,10MUL BLMOV BL,[NUM+3]SUB BL,30HMOV BH,0ADD BX,AXGO_ON:MOV [OPE],BX;循环初始化MOV CX,BXDEC CXJCXZ CX_ZERODO1:DEC BXCALL MUL_bigLOOP DO1JMP GO_ON1CX_ZERO:MOV [OPE],1GO_ON1:MOV AX,[OPE];将结果转换成ASCII码LEA DI,RESULTADD DI,15CALL BIN_TO_NUMMOV AX,[OPE+2]CALL BIN_TO_NUMMOV AX,[OPE+4]CALL BIN_TO_NUMMOV AX,[OPE+6]CALL BIN_TO_NUMCMP [NUM+1],1;输出'n!='JE NUM_EQU_1MOV AL,[NUM+2]MOV [FUNC],ALMOV AL,[NUM+3]MOV [FUNC+1],ALLEA DX,FUNCJMP OUTPUT_STRNUM_EQU_1:MOV AL,[NUM+2]MOV [FUNC+1],ALLEA DX,FUNCINC DXOUTPUT_STR:MOV AH,9HINT 21HLEA SI,RESULT;从第一个非零的地方输出结果,然后回到开始DEC SILOOP1:INC SICMP BYTE PTR [SI],30HLOOPZ LOOP1MOV AH,9HMOV DX,SIINT 21HJMP LOP1ERR_NUM:DS_STR ERR_MESS;输出错误信息,然后回到开始JMP LOP1OVER:MOV AH,4CHINT 21HMUL_big PROC NEAR;相乘,完成OP1和BX的乘,结果保存在OPE起始的四个字里PUSH AXPUSH SIPUSH DIPUSH CXPUSH DXMOV CX,BXDEC CXJCXZ NEXTMOV AX,[OPE]MOV SI,[OPE+2]MOV DI,[OPE+4]MOV DX,[OPE+6]DO:ADD [OPE],AXADC [OPE+2],SIADC [OPE+4],DIADC [OPE+6],DXLOOP DONEXT:POP DXPOP CXPOP DIPOP SIPOP AXRETMUL_big ENDPBIN_TO_NUM PROC NEAR;将AX中的十六进制数转换成相应ASCII码,结果保存在[DI]~[DI+3]中PUSH CXPUSH BXMOV CX,4AGAIN:PUSH CXMOV CX,4AGAIN1:RCR AX,1RCR BL,1LOOP AGAIN1SHR BL,1SHR BL,1SHR BL,1SHR BL,1CMP BL,9JBE LABEL_BEADD BL,7LABEL_BE:ADD BL,30HMOV [DI],BLDEC DIPOP CXLOOP AGAINPOP BXPOP CXRETBIN_TO_NUM ENDPCODES ENDSEND START。
汇编N的阶乘程序
CRLF MACRO ;回车,换行MOV AH, 02HMOV DL, 0DHINT 21HMOV AH, 02HMOV DL, 0AHINT 21HENDMDATA SEGMENTMESS1 DB 'INPUT THE NUMBER ACCORDING TO HEXNUM!',0DH,0AH,'$' MESS2 DB 'THE RESULT IS: $'ERROR DB 'INPUT ERROR! INPUT ONCE MORE!',0DH ,0AH,'$'LEN DW 1CY DW ?BUF DW 256 DUP(0)DATA ENDSSTACK SEGMENT STACK 'STACK'DW 32 DUP(?)STACK ENDSCODE SEGMENTASSUME CS: CODE, DS:DATA, ES:DATA, SS:STACKSTART: MOV AX, DATAMOV DS,AXMOV ES, AXMOV AH, 09HMOV DX,OFFSET MESS1INT 21H ;显示输入提示信息CALL GETNUM ;读取键入的N值MOV BP, DX ;N值送BPCMP BP, 0JZ EEECMP BP, 1JZ EEE ;N=0或N=1则转EEEMOV SI, OFFSET BUF ;缓冲区首址MOV [SI],DX ;缓冲区初始化为值N XXX: DEC BP ;N值减1CMP BP,0001HJZ LLL ;若为1则转LLLXOR BX,BX ;偏移指针清0MOV WORD PTR CY,0 ;进位单元清0MOV CX,LEN ;当前结果长度送CXTTT: MOV AX, [SI+BX]MUL BP ;相乘ADD AX,CY ;加低位进位JNC JJJ ;结果无进位转JJJINC DX ;有进位将高位单元加1JJJ: MOV [SI+BX],AX ;结果送缓冲区中MOV CY,DX ;高位单元送进位单元INC BXINC BX ;一个字长度LOOP TTT ;循环CMP DX, 0000HJZ BBB ;最后1次的进位为0则转BBBINC WORD PTR LEN ;长度加1MOV [SI+BX],DX ;进位送缓冲区中BBB: JMP XXXEEE: MOV SI,OFFSET BUFMOV WORD PTR [SI],1 ;结果为1LLL: MOV AH, 09HMOV DX,OFFSET MESS2INT 21H ;显示表头MOV CX,LENMOV BX,CX ;长度DEC BXSHL BX,1 ;1个字为两个字节CCC: MOV AX, [SI+BX]CALL DISPDEC BXDEC BX ;显示结果LOOP CCCMOV AX,4C00H ;结束INT 21HDISP1 PROC NEAR ;显示字符(AL)MOV BL, ALMOV DL, BLMOV CL, 04ROL DL, CLAND DL, 0FHCALL DISPL ;显示高位MOV DL, BLAND DL, 0FHCALL DISPL ;显示低位RETDISP1 ENDPDISPL PROC NEAR ;显示一位(DL=0XH)ADD DL, 30HCMP DL, 3AHJB DDDDDD: MOV AH, 02HINT 21HRETDISPL ENDPDISP PROC NEAR ;显示4位数(HEX) PUSH BXPUSH CXPUSH DXPUSH AXMOV AL, AHCALL DISP1POP AXCALL DISP1POP DXPOP CXPOP BXRETDISP ENDPGETNUM PROC NEAR ;字符匹配程序PUSH CXREGET: XOR DX, DXGGG: MOV AH, 01HINT 21HCMP AL, 0DHJZ PPPCMP AL, 20HJZ PPPSUB AL, 30HJB KKKCMP AL, 0AHJB GETSCMP AL,11HJB KKKSUB AL, 07HCMP AL, 0FHJBE GETSCMP AL, 2AHJB KKKCMP AL, 2FHJA KKKSUB AL, 20HGETS: MOV CL, 04HSHL DX,CLADD DX ,AXJMP GGGKKK: CRLFMOV AH, 09HMOV DX,OFFSET ERROR INT 21HJMP REGETPPP: PUSH DXCRLFPOP DXPOP CXRETGETNUM ENDP CODE ENDSEND START。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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之间变化(输出结果从右往左每四个数之间用一个“,”隔开)。
然后对程序进行编译,运行,并不断完善细节,不断优化。
第三部分设计方案
(一)设计分析
1、解决结果的存放问题
由于是求一个大数n的阶乘,结果的很大(会溢出),无法直接输出或得到结果,所以在经过探索及请教同学之后拟定用乘法的基本原理把用户给的数据求得阶乘后的结果的个、十、百、千...位依次赋数给数组a[200] ——即a[0] =个位上的数,a[1] =十位上的数 .....以此类推。
2、结果位数的解决
根据数组a中的数据存放情况,从数组最后一位a[199]开始,往前依次进行观察,直至a[j]不为零,则证明结果的位数为j+1
3、“,”隔开
根据题目所要求的,输出结果从右往左每四个数之间用一个“,”隔开。
分析可知,这是将之前存放在数组a中的数进行规律性输出,最终拟定采用for循环解决。
又由于结果除以4的余数不同引起的输出规律有些许差异,最终决定分余数是否为0两种情况来输出最终结果。
4、意外处理
由于n的值是由操作者输入,需要考虑当输入值超出1~100范围时的程序应对方式(告知操作者:输入数据错误)。
(二)模块的功能及程序说明
上面的这一模块为核心模块,是用乘法的基本原理把用户给的数据求得阶乘后的结果的个、十、百、千...位依次赋数给数组a[200],即a[0] =个位上的数,a[1] =十位上的数 .....
(三)核心源程序模块
【将n阶乘后结果的个、十、百、千...位依次赋数给数组a[200]】
(四)核心算法流程图。