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(长整型)数据类型的范围。
- 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]】
(四)核心算法流程图。