大整数阶乘程序设计_B09040121
- 格式:doc
- 大小:367.00 KB
- 文档页数:30
程序设计报告( 2010 / 2011学年第一学期)题目:大整数阶乘专业计算机科学与技术学生姓名张赛班级学号B09040121指导教师杨一涛指导单位计算机学院日期2010.9.30大整数阶乘一、课题内容和要求1、系统的基本功能及要求(1)写一个类BigInteger,并有如下成员函数operator+/ operator-/ operator*/ operator\,即整数的四则运算并重载运算符。
(2)用该大整数计算n的阶乘并显示出来。
(n∈[1,100])注:为了简化,可不考虑负数,则遇上形如“2-4”这样的表达式需要报错。
2、程序执行过程(1)系统从键盘读入自然数n,直到输入了合法的n为止。
(2)输出运算的结果,为便于观察结果,每输出四位中间插入空格,格式如下(例如,n=12):12!= 4790 0160 0(3)询问用户是否继续进行,用户选择“是”,直到输入合法为止,转(1),否则退出程序。
3、算法要求及提示(1)因为n较大时,n!的结果将超出长整形的保存范围,因此结果不能用long int型的变量来保存。
本算法要求用链表来存储。
(2)链表的每一个节点存储结果的一位数字,因此结果的输出实际上是链表的遍历问题,同时要先考虑用多少位来表示大整数。
4、其他要求(1)输入时具备一定的容错性判断,如输入的不是数字,或输入的数超过范围等等。
(2)变量、函数命名符合规范。
(3)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
(4)程序的层次清晰,可读性强。
二、需求分析1)课题要求已说明结果不能用long int型的变量来保存,要求用链表来存储。
,首先要定义一个节点类,在这里定义一个双向节点类。
2)定义一个BigInteger大整数类,使其能够存放大数阶乘,并实现其的四则运算。
3)对输入整数的合法性进行检查,必须考虑用户各种输入情况。
c语言阶乘循环结构阶乘是数学中的一个概念,指一个正整数n与小于等于n的所有正整数的积,通常用n!表示。
例如,5! = 5 × 4 × 3 × 2 × 1 = 120。
在计算机编程中,阶乘是一个常见的问题,也是循环结构的一个经典案例。
在C语言中,我们可以使用循环结构来计算阶乘。
具体来说,我们可以使用for循环或while循环来实现。
下面是使用for循环计算阶乘的代码:```#include <stdio.h>int main() {int n, i, fact = 1;printf("请输入一个正整数:");scanf("%d", &n);for (i = 1; i <= n; i++) {fact *= i;}printf("%d的阶乘是%d\n", n, fact);return 0;}```在上面的代码中,我们首先定义了三个变量n、i和fact,其中n 表示要计算阶乘的正整数,i表示循环变量,fact表示阶乘的结果。
然后,我们使用for循环从1到n遍历所有的正整数,并将它们的乘积累加到fact中。
最后,我们输出计算结果。
除了使用for循环,我们还可以使用while循环来计算阶乘。
下面是使用while循环计算阶乘的代码:```#include <stdio.h>int main() {int n, i = 1, fact = 1;printf("请输入一个正整数:");scanf("%d", &n);while (i <= n) {fact *= i;i++;}printf("%d的阶乘是%d\n", n, fact);return 0;}```在上面的代码中,我们首先定义了三个变量n、i和fact,其中n 表示要计算阶乘的正整数,i表示循环变量,fact表示阶乘的结果。
数据结构课程设计报告题目:长整数四则运算学院计算机学院专业计算机科学与技术年级班别2010级四班学号3110006015学生姓名张法光指导教师张巍成绩____________________2012年6月一、需求分析1、设计一个实现任意长的整数进行四则运算的程序。
2、利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
3、输入和输出形式是按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。
4、实现长整数四则运算、阶乘和乘方运算。
4、测试数据:(以加法为例)(1)、0;0;+;应输出“0”。
(2)、-2345,6789;-7654,3211;+;应输出“-1,0000,0000”。
(3)、-9999,9999;1,0000,0000,0000;+;应输出“9999,0000,0001”.(4)、1,0001,0001;-1,0001,0001;+;应输出“0”.(5)、1,0001,0001;-1,0001,0000;+;应输出“1”。
(6)、-9999,9999,9999;-9999,9999,9999;+;应输出“-1,9999,9999,9998”.(7)1,0000,9999,9999;1;+;应输出“1,0001,0000,0000”.二、概要设计为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过9999的整数,整个链表用十进制数表示。
利用头结点数据域的符号表示长整数的符号,相加过程不破坏两个操作数链表,对长整数位数不作上限。
为此需要两个结构数据类型:双向循环链表和长整数,两个类型采用相同的结构,只是双向循环链表用来存储数据,长整型用表示数据的运算。
1、双向循环链表的数据结构及操作定义如下:typedef int Status;typedef int ElemType;typedef struct DuLNode //双向循环链表结点{ElemType data;struct DuLNode * prior;struct DuLNode * next;}DuLNode,* DuLinkList;typedef struct //双向循环链表{DuLinkList head; //双向循环链表头结点,不存放数据int len; //双向循环链表中的结点个数,头结点不计}LinkList;基本操作:Status InitList(LinkList &L);//构造一个空的线性链表void ClearList(LinkList &L);//将线性链表L重置为空表,并释放原链表的结点空间Status HeadInser(LinkList &L,ElemType e);//在线性链表的头结点后插入数据元素为e的新结点Status TailInser(LinkList &L,ElemType e);//在线性链表的头结点前插入数据元素为e的新结点Status HeadDelete(LinkList &L);//删除头结点后的第一个结点Status ListCopy(LinkList &L,LinkList L1);//将L1复制给L,保持L1不变2、长整数的数据类型和和操作定义为:void ScanNum(LinkList &L);//从键盘输入一个长整数,存至L;void PrintNum(LinkList L);//在屏幕打印长整数Lvoid NumChange(LinkList &L);//将长整数L还原成一般格式Status NumLarger(LinkList L1,LinkList L2);//比较正数L1与正数L2的大小,若L1大于或等于L2,返回TRUE,否则返回FALSE void NumPlus(LinkList L1,LinkList L2,LinkList &L3);//将L1与L2相加,结果存至L3; 即C=A+B;void NumMinus(LinkList L1,LinkList L2,LinkList &L3);//计算L1减去L2的值,结果存至L3;即C=A-B;void NumMul(LinkList L1,LinkList L2,LinkList &L3);//将L1与L2相乘,结果存至L3;即C=A*B;Status NumDiv(LinkList L1,LinkList L2,LinkList &L3,LinkList &L4);即C=A/B;//计算L1除以L2,商存至L3,余数存至L4,若L2为零,返回ERROR,否则返回OKStatus jiecheng(LinkList L1,LinkList &L2)即C=A!;//求L1的阶乘L2;若L1小于零,返还ERROR;否则返回OK;Status chengfang(LinkList L1,LinkList L2,LinkList &L3) 即C=A^B;//求L1的L2次方的结果,若L2小于零,返还ERROR;否则返回OK;3、本程序包含四个模块:1)主程序模块:void main( ) //main.c{初始化;do{接受命令;处理命令;}while(“命令”=“结束”)}2)双向循环链表处理模块//LinkList.h;3)长整数运算模块//LongNum.h ,jiecheng.h , chengfang.h;4)界面模块 //Interface.h各模块之间的调用关系如下:主程序模块==========================================长整数运算模块界面模块======================双向循环链表处理模块=======================三、详细设计1、主要函数主程序模块//main.c双向循环链表处理模块//LinkList.h长整数四则运算模块//LongNum.h阶乘运算模块//jiecheng.h乘方运算模块//chengfang.h界面模块//Interface.hchar ShowMenu() //界面菜单显示char ShowPlus() //加法运算显示char ShowMinus() //减法运算显示char ShowMul() //乘法运算显示char ShowDiv() //除法运算显示char Showchengfang()//乘方运算显示char Showjiecheng() //阶乘运算显示2、函数的主要调用关系图InitList ClearList Interface=============================ShowScanNumJiecheng chengfang NumMinus NumChange======================================================================四、调试分析及编程心得体会刚开始使用C指针有偏颇,通过逐步调试修正错误。
c语言计算阶乘C语言是一门广泛应用于各类编程领域的编程语言。
在数学计算中,阶乘是一个重要的概念,指从1开始连乘到某个正整数n。
本文将介绍C语言如何计算阶乘,并为读者展示如何编写阶乘计算程序。
1. 什么是阶乘?阶乘是一个数列,它的每一个元素是对应正整数的阶乘结果。
例如:5!=5×4×3×2×1=120。
阶乘在计算组合、排列等问题时具有重要的应用。
C语言可以通过循环方式来计算阶乘。
2. 用C语言计算阶乘在C语言中,我们可以使用for循环和while循环两种方式来实现阶乘计算。
下面是使用for循环实现阶乘计算的代码:#include <stdio.h>int main(){int num, fact = 1, i;printf("请输入一个正整数:");scanf("%d", &num);for(i=1; i<=num; i++){fact = fact * i;}printf("%d的阶乘为:%d\n", num, fact);return 0;}在这段代码中,我们首先定义了三个变量:一个用于存储用户输入的正整数,一个用于存储阶乘结果的变量fact,以及一个用于循环计算的变量i。
然后通过scanf()函数从用户输入中获取需要计算阶乘的正整数。
接下来使用for循环对正整数进行循环,计算阶乘结果。
最后使用printf()函数输出计算结果。
注意,这里使用%d 格式符来输出整型变量。
3. 计算阶乘的局限性在实际使用中,计算阶乘可能会遇到计算结果溢出的问题。
因为阶乘的结果往往非常大,可能会超出C语言的数据类型能够表示的范围。
此时,我们可以使用高精度计算的方法来解决这个问题。
通过定义一个结构体变量来存储阶乘计算的结果,可以避免溢出问题。
4. 总结在本文中,我们介绍了C语言计算阶乘的方法,以及如何避免计算结果溢出的问题。
c语⾔⼤数加法、阶乘和乘法⼀.⼤数加法定义两个⾜够⼤的数字,其数值远超过long的取值范围,设该⼤数的位数有两百位,求其相加所得⼤数加法的核⼼思想详见此链接,内有详细的动画演⽰,这⾥不再赘述直接上代码:#include<string.h>#include<stdio.h>#define N 10//定义当前⼀个⾜够⼤的数字为10位,可任意更改void print_num(int a[],int n){int i=n-1;//从逆序数组的最后⼀项开始查找,进⾏反逆序while(a[i]==0)//由于规定的数组⽐真实计算的数字⼤,所以数组最后⼏位必定存在0的情况--i;//这种情况下⼀定要将0舍去,否则会抬⾼数组的位数for(;i>=0;i--)//找到⾮零的数组,进⾏反逆序输出printf("%d",a[i]);}void plus(int num1[],int num2[],int n){//尤其注意!由于数组是逆序的,所以num[0]是个位,num[1]是⼗位,num[2]是百位for(int i=0,up=0;i<n;i++)//算法参考⼩学加法,这⾥定义⼀个up进位标记{int temp=num1[i]+num2[i]+up;//up最开始设为0,因为在个位⽆法获取进位num1[i]=temp%10;//若产⽣进位⾏为,则选取个位部分赋给num1up=temp/10;//在个位上,若个位相加产⽣进位,则⽤temp/10取整加到下⼀次的⼗位上}print_num(num1, n);}int main(){char buffer1[]="123456";//缓冲数组,将当前数组倒序写⼊num1中char buffer2[]="78951234";//同上,写⼊num2中int num1[N]={0};//将num1,2全部置为0,⽤来将缓冲数组写⼊到num数组当中int num2[N]={0};int n=N;//定义上述两个数组的长度为10for(int i=0,temp=(int)strlen(buffer1)-1;temp>=0;temp--)num1[i++]=buffer1[temp]-'0';//⽤倒序的⽅式将缓冲数组写⼊num中,意味着num的第⼀位是个位,第⼆位是⼗位,三是百位...for(int i=0,temp=(int)strlen(buffer2)-1;temp>=0;temp--)num2[i++]=buffer2[temp]-'0';plus(num1, num2, n);//将两数字相加printf("\n");}⼆.⼤数阶乘⼤数阶乘的中⼼思想参考上述视频和⼀篇博客,博客详情:但是,这⾥需要说明⼀个点:1*2=2,将2存到a[0]中,接下来是⽤a[0]*3;2*3=6,将6储存在a[0]中,接下来是⽤a[0]*4;6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,接下来是⽤a[0]*5;a[1]*5+num(如果前⼀位相乘结果位数是两位数,那么num就等于⼗位上的那个数字;如果是⼀位数,num==0)24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中由于上述博客存在某些地⽅没有说清楚的情况,这⾥解释⼀下关于上述博客的Q&A:1.这⾥的num指的是什么?答:这⾥的num指的是前⾯两数值相乘后进位数位多少:例如6*4得24,这⾥的num值的是24/10=2,进位数为2,num=22.下⾯代码为什么要充i=2开始?答:如果这⾥看懂了代码其实理解2不是很难,但是没有看懂是真的难懂:⾸先明确⼀点:5的阶乘是1*2*3*4*5,我定义的value数组的第⼀位为1,⽽我的i是从2起的,这样以来不就直接凑出了1*2了吗?当我的i⾃增到3,我直接在value数组中找出1*2的值,拿他们去和3相乘,也就凑成了1*2*3了3.如何在代码当中表现出进位的思想?答:我们以5!为例,当计算到1*2*3*4的时候,value当中的表现形式是42000000,从左到右依次是个位,⼗位,百位,千位...etc(value表⽰的是24这个数字)我们在关于j的循环当中拿i=5去和value数组求乘积:5先和位于个位的4求积得20:20%10得0,0放⼊个位中;20/10得2,进位为2,up=2。
vb课程设计报告阶乘一、教学目标本章节的教学目标是让学生掌握阶乘的概念,理解阶乘的计算方法,能够运用阶乘解决相关问题。
具体分为以下三个部分:1.知识目标:使学生了解阶乘的定义,掌握阶乘的计算规则,能够准确地计算任意正整数的阶乘。
2.技能目标:培养学生运用阶乘解决实际问题的能力,能够运用编程语言(如VB)实现阶乘的计算。
3.情感态度价值观目标:培养学生对数学的兴趣,激发学生探究数学问题的热情,培养学生的团队合作精神。
二、教学内容本章节的教学内容主要包括阶乘的定义、阶乘的计算方法以及运用阶乘解决实际问题。
具体分为以下三个部分:1.阶乘的定义:介绍阶乘的概念,解释阶乘的计算规则。
2.阶乘的计算方法:教授如何利用递归法、循环法等方法计算阶乘。
3.运用阶乘解决实际问题:通过编程语言(如VB)实现阶乘的计算,让学生学会运用阶乘解决相关问题。
三、教学方法为了达到本章节的教学目标,将采用以下教学方法:1.讲授法:教师讲解阶乘的定义、计算方法以及运用阶乘解决实际问题。
2.讨论法:学生分组讨论,分享各自的解题思路和编程方法。
3.案例分析法:分析典型的阶乘问题,引导学生运用阶乘解决实际问题。
4.实验法:学生动手实践,利用编程语言(如VB)实现阶乘的计算。
四、教学资源为了支持本章节的教学内容和教学方法,将准备以下教学资源:1.教材:提供相关章节,介绍阶乘的定义、计算方法以及运用阶乘解决实际问题。
2.参考书:提供数学及相关领域的参考书籍,丰富学生的知识体系。
3.多媒体资料:制作PPT、视频等资料,帮助学生更好地理解阶乘的概念和计算方法。
4.实验设备:提供计算机等设备,让学生动手实践,利用编程语言(如VB)实现阶乘的计算。
五、教学评估本章节的评估方式将包括以下几个部分:1.平时表现:评估学生在课堂上的参与程度、提问回答情况以及小组合作的表现。
2.作业:评估学生提交的阶乘相关练习题,包括计算题和编程题。
3.考试:设计一份包含阶乘知识点的考试,评估学生对阶乘的理解和应用能力。
大数阶乘c语言程序下面是一个计算大数阶乘的C 语言程序:c#include <stdio.h>#include <stdlib.h>/* 定义一个结构体来表示大数*/typedef struct {unsigned int digits[1000]; 数字数组int length; 数字长度} BigNum;/* 初始化大数为1 */void init(BigNum *p) {int i;for (i = 0; i < 1000; i++) {p->digits[i] = 0;}p->digits[0] = 1;p->length = 1;}/* 大数乘法*/void multiply(BigNum *p, int n) {int i, carry = 0;for (i = 0; i < p->length; i++) {int value = p->digits[i] * n + carry;p->digits[i] = value % 10;carry = value / 10;}while (carry > 0) {p->digits[p->length] = carry % 10;p->length++;carry /= 10;}}/* 计算阶乘*/void factorial(int n) {BigNum result;init(&result);int i;for (i = 1; i <= n; i++) {multiply(&result, i);}printf("%d! = ", n);for (i = result.length - 1; i >= 0; i) {printf("%d", result.digits[i]);}printf("\n");}int main() {int n;printf("请输入要计算的阶乘:");scanf("%d", &n);if (n < 0) {printf("错误:阶乘不能为负数!\n");return 0;}if (n > 1000) {printf("错误:阶乘过大!\n");return 0;}factorial(n);return 0;}这个程序使用一个自定义的`BigNum` 结构体来表示大数,其中`digits` 数组存储数位,`length` 表示数字的长度(即数位数)。
python计算阶乘Python作为一种跨平台的编程语言,不仅具有简单易学、可读性好等特点,在解决复杂计算问题上也表现出了较强的能力。
本文将介绍如何使用Python语言来计算阶乘。
首先,我们来解释下什么是阶乘。
阶乘的定义是:任意一个正整数的阶乘,即从1乘以该正整数至本身之积,符号表示为:n!,其结果可以表示为:n!=1*2*3*…*n。
下面我们就来演示如何使用Python来计算阶乘。
首先,我们定义一个函数,带有一个参数n,表示要进行计算的数字。
def factorial(n):#来保存计算结果result = 1#环,从1乘以nfor i in range(1,n+1):# 依次将结果乘以1,2,3,…,nresult *= ireturn result# 使用函数print(factorial(5))上面的代码,我们定义了一个factorial函数,该函数接受一个参数n,表示要计算的阶乘数字,然后在函数内部使用一个for循环,从1乘以n,依次将结果乘以1,2,3,…,n,最终将计算结果返回。
最后,我们可以把该函数用在多种场景中,例如,计算5!,我们只需要调用factorial(5),就可以得到答案120。
但是,有时候,我们可能需要计算更大的数字,此时,我们可以通过定义一个较大的数来进行计算。
例如,当计算1000的阶乘,我们可以定义MAXNUMBER = 1000,然后使用for循环,将MAXNUMBER 乘以1,2,3,…,1000,最终得出计算结果。
与其他语言相比,Python语言计算阶乘更加简单,可读性更强,在计算阶乘时,可以很快捷地实现。
上面的示例代码表明,通过定义一个函数,使用for循环,就可以实现阶乘的计算。
这种方法有利于快速计算阶乘,也可以减少代码的复杂度。
此外,在Python中,还有一些模块可以提供更高级的计算功能,比如math模块,可以用来计算大数的阶乘,该模块中提供了一个factorial函数:from math import factorial# 使用函数print(factorial(1000))上面代码中,我们使用了math模块中的factorial函数,可以非常容易地实现对大数的阶乘计算,在实际应用中,可以根据计算阶乘的实际需求,选择适当的计算方法。
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. 动态规划动态规划是一种通过存储中间结果来避免重复计算的方法。
在阶乘问题中,可以预先计算较小的阶乘值,并用它们来构建较大的阶乘值。
C语⾔课程设计⼤整数运算明⼈不说暗话,直接上,输⼊提取码baxj即可下载。
该⼤整数运算系统⽤于对有符号的位数不超过500位的⼤整数进⾏加、减、乘、除四则运算和计算N(0<=N<=10000)的阶乘。
注意事项:1、操作期间,进⾏四则运算时若⼤整数为正数请直接省略‘+ ’号。
\n");2、该⼤整数运算系统设定处理位数不超过500位的⼤整数四则运算和计算N(0<=N<=10000)的阶乘,可根据情况调整相关程序参数,进⾏位数更⼤的四则运算和N值更⼤的阶乘计算。
3、为了保证程序设计流程的简捷性,该系统没有很⾼的操作容错性能,所以欲执⾏某项功能,请务必根据提⽰输⼊正确的选项值进⾏操作。
课程设计中包含程序,程序运⾏所需⽂件,设计报告(电⼦版和打印版),应有尽有,欢迎⼩伙伴们在本博客的⽂件中下载使⽤。
下⾯的程序正常运⾏需要在百度⽹盘中下在相应输出⽂件,否则⽆法正常使⽤哦。
1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<ctype.h>5 #include <conio.h>6const int N1=40000;7const int N2=510;89void Display(); //显⽰主菜单10char* Input(char str[]); //输⼊11void Output(int result[],int j); //输出12int Add(char str1[],char str2[],int result[]); //相加13int Sub(char str1[],char str2[],int result[]); //相减14int Mul(char str1[],char str2[],int result[]); //相乘15int Div(char str1[],char str2[],int result[]); //相除16int Fac(int n,int result[]); //计算阶乘17int Substract(int *bjs,int *js,int Num_len1,int Num_len2); //计算差的位数18//以上函数返回值为int类型的均是结果的⾸位⾮零数字在数组中的下标,⼩于0表⽰⽆结果不输出19int IsBig_num(char str1[],char str2[]); //⽐较2021int main()22 {23int select,op,n,rs=-1,result[N1];24//rs表⽰该数的⾸位⾮零数字在数组中的下标,⼩于0表⽰⽆结果不输出25char str1[N2],str2[N2],*Fir_num,*Sec_num;26while(1)27 {28 Display();29 printf("\n请输⼊欲执⾏功能的选项值(0-4): ");30 scanf("%d",&select);31switch(select)32 {33case1:34 printf("\n\t\t1 加法运算\n");35 printf("\n\t\t2 减法运算\n");36 printf("\n\t\t3 乘法乘法\n");37 printf("\n\t\t4 除法运算\n");38 printf("\n请输⼊对应运算的选项值(1-4): ");39 scanf("%d",&op);40 memset(result,0,sizeof(result));41switch(op)42 {43case1:44 printf("\n请输⼊⼀个不超过500位的⼤整数作为⼀个加数\n");45 Fir_num=Input(str1);46 printf("\n请输⼊另⼀个不超过500位的⼤整数作为另⼀个加数\n");47 Sec_num=Input(str2);48 printf("\n两数之和为\n");49 rs=Add(Fir_num,Sec_num,result);50break;51case2:52 printf("\n请输⼊⼀个不超过500位的⼤整数作为被减数\n");53 Fir_num=Input(str1);54 printf("\n请输⼊另⼀个不超过500位的⼤整数作为减数\n");55 Sec_num=Input(str2);56 printf("\n两数之差为\n");57 rs=Sub(Fir_num,Sec_num,result);58break;59case3:60 printf("\n请输⼊⼀个不超过500位的⼤整数作为⼀个因数\n");61 Fir_num=Input(str1);66break;67case4:68 printf("\n请输⼊⼀个不超过500位的⼤整数作为被除数\n");69 Fir_num=Input(str1);70 printf("\n请输⼊另⼀个不超过500位的⼤整数作为除数\n");71 Sec_num=Input(str2);72 printf("\n两数之商为\n");73 rs=Div(Fir_num,Sec_num,result);74break;75default:76 printf("\n⽆效输⼊\n");77 }78break;79case2:80 printf("\n请输⼊N(0<=N<=10000)\n");81 scanf("%d",&n);82if(n>10000||n<0)83 printf("\n错误输⼊(0<=N<=10000)\n");84else85 {86 memset(result,0,sizeof(result));87 rs=Fac(n,result);88 printf("\n%d!为\n",n);89 }90break;91case3:92 FILE *fp;93if(NULL==(fp=fopen("系统简介.txt","r")))94 printf("⽂件打开失败!\n");95char ch1;96while(EOF != (ch1=fgetc(fp)))97 {98 printf("%c",ch1);99 }100 fclose(fp);101break;102case4:103 FILE *fq;104if(NULL==(fq=fopen("开发⼈员.txt","r")))105 printf("⽂件打开失败!\n");106char ch2;107while(EOF != (ch2=fgetc(fq)))108 {109 printf("%c",ch2);110 }111 fclose(fq);112break;113case0:114return0;115default:116 printf("\n⽆效输⼊\n");117 }118if(rs >= 0)119 {120 Output(result,rs);121 rs=-1;122 }123 printf("\n__________________________________________\n"); 124 printf("\n按任意键继续 . . . ");125 getch();126 system("cls");127 }128 }129//主菜单130void Display(void)131 {132 printf("\n* * * * * * * * * * * * * * * * * * * * *\n");133 printf("\t ⼤整数运算系统 \n");134 printf("* * * * * * * * * * * * * * * * * * * * *\n");135 printf("\t\t1 四则运算\t \t\n");136 printf("\t\t2 计算N! \t\t\n");137 printf("\t\t3 系统简介 \t\t\n");138 printf("\t\t4 开发⼈员 \t\t\n");139 printf("\t\t0 退出 \t\t\n");140 printf("* * * * * * * * * * * * * * * * * * * * *\n");141 }142//输⼊函数143char* Input(char str[])144 {145 scanf("%s",str);150 p--;151return p;152 }153//输出函数154void Output(int result[],int j)155 {156int i;157for(i=j;i>=0;i--)158 printf("%d",result[i]);159 printf("\n");160 }161//加法函数162int Add(char str1[],char str2[],int result[])163 {164int Num_len1,Num_len2,l,i,j;165if(str1[0]=='-'||str2[0]=='-')166 {167if(str1[0]=='-'&&str2[0]=='-')168 {169 printf("-");170 str1++;171 str2++;172 }173else174 {175if(str1[0]=='-')176 {177if(IsBig_num(str1+1,str2)==0)178return0;179else if(IsBig_num(str1+1,str2)<0)180return Sub(str2,str1+1,result);181else182 {183 printf("-");184return Sub(str1+1,str2,result);185 }186 }187else188 {189if(IsBig_num(str1,str2+1)==0)190return0;191else if(IsBig_num(str1,str2+1)>0)192return Sub(str1,str2+1,result);193else194 {195 printf("-");196return Sub(str2+1,str1,result);197 }198 }199 }200 }201 strrev(str1);202 strrev(str2);203 Num_len1=strlen(str1);204 Num_len2=strlen(str2);205if(Num_len1>=Num_len2) {//按较⼤数的位数将⼩数⾼位⽤0补齐206 l=Num_len1;207for(i=Num_len2;i<l;i++)208 str2[i]='0';209 }210else{211 l=Num_len2;212for(i=Num_len1;i<l;i++)213 str1[i]='0';214 }215for(i=0;i<l;i++){216 result[i] += str1[i]-'0'+str2[i]-'0';//⼀⼀对应-'0'217if(result[i] > 9)218 {219 result[i] %= 10;220 result[i+1]++;//进位221 }222 }223for(j=i;j>=0;j--)224if(result[j])//返回结果的⾮零⾸位在数组中的下标225return j;226return0;227 }228//减法函数229int Sub(char str1[],char str2[],int result[])234 {235if(str1[0]=='-'&&str2[0]=='-')236 {237if(IsBig_num(str1+1,str2+1)==0)238return0;239else if(IsBig_num(str1+1,str2+1)<0) 240 {241 temp=str2++;242 str2=str1++;243 str1=temp;244 }245else246 {247 printf("-");248 str1++;249 str2++;250 }251 }252else253 {254if(str1[0]=='-')255 {256 printf("-");257return Add(str1+1,str2,result);258 }259else260return Add(str1,str2+1,result);261 }262 }263else264 {265if(IsBig_num(str1,str2)==0)266return0;267else if(IsBig_num(str1,str2)<0)268 {269 printf("-");270 temp=str2;271 str2=str1;272 str1=temp;273 }274 }275 Num_len1=strlen(str1);276 Num_len2=strlen(str2);277 strrev(str1);278 strrev(str2);279if(Num_len1>Num_len2){//⾼位补零280for(i=Num_len2;i<Num_len1;i++)281 str2[i]='0';282 }283for(i=0;i<Num_len1;i++) {284 result[i] += (str1[i]-'0') - (str2[i]-'0');285if(result[i] < 0){286 result[i] += 10;287 result[i+1]--;288 }289 }290for(i=Num_len1-1;i>=0;i--)291if(result[i])292return i;293return0;294 }295//乘法函数296int Mul(char str1[],char str2[],int result[])297 {298int i,j,Num_len1,Num_len2;299if(str1[0]=='-'||str2[0]=='-')300 {301if(str1[0]=='-'&&str2[0]=='-')302 {303 str1++;304 str2++;305 }306else307 {308 printf("-");309if(str1[0]=='-')310 str1++;311if(str2[0]=='-')312 str2++;313 }318 strrev(str2);319//乘积320for(i=0;i<Num_len1;i++)321for(j=0;j<Num_len2;j++)322 result[i+j] += (str1[i]-'0')*(str2[j]-'0');323//处理进位324for(i=0;i<N2*2;i++) {325if(result[i] > 9)//先计算进位,否则前⾯的值先改变,不能进位326 {327 result[i+1] += result[i] / 10 ;328 result[i] %= 10;329 }330 }331//输出332for(i=2*N2;i>=0;i--)333if(result[i])334return i;335return0;336 }337//除法函数338int Div(char str1[],char str2[],int result[])339 {340int a[N2],b[N2];341int i,j,k,Num_len1,Num_len2,n;342if(str1[0]=='-'||str2[0]=='-')343 {344if(str1[0]=='-'&&str2[0]=='-')345 {346 str1++;347 str2++;348 }349else350 {351 printf("-");352if(str1[0]=='-')353 str1++;354if(str2[0]=='-')355 str2++;356 }357 }358 Num_len1=strlen(str1);359 Num_len2=strlen(str2);360if(Num_len2==1 && str2[0]=='0'){361 printf("错误输⼊(除数不能为零)\n");362return -1;363 }364 memset(a,0,sizeof(a));//数组初始化365 memset(b,0,sizeof(b));366for(j=0,i=Num_len1-1;i>=0;i--)367 a[j++]=str1[i]-'0';368for(j=0,i=Num_len2-1;i>=0;i--)369 b[j++]=str2[i]-'0';370371 Num_len1=Substract(a,b,Num_len1,Num_len2);372if(Num_len1<=0){373if(Num_len1<0) {374return0;//第⼀次减时不够减为375 }376else {377 result[0]=1;//正好够减商为378return0;379 }380 }381 result[0]++;382 n=Num_len1-Num_len2;383if(n<0) {384 result[0]=1; //减过⼀次不够减商为385return0 ;386 }387else if(n>0) {388for(i=Num_len1-1;i>=0;i--) {//将减数逆置389if(i>=n)//倒着存储当i⼤于等于n时,将i的位置存i-n的值,否则存0 390 b[i]=b[i-n];391else392 b[i]=0;393 }394 }395 Num_len2=Num_len1;396for(j=0;j<=n;j++) {397while( (k=Substract(a,b+j,Num_len1,Num_len2-j)) >= 0)//传递对应的参数403for(i=0;i<N2;i++){404if(result[i]>=10)405 result[i+1] += result[i]/10;//先进位再处理本位406 result[i] %= 10;407 }408for(i=N2;i>=0;i--)409if(result[i])410return i;411return0;412 }413//计算差的长度函数414int Substract(int *bjs,int *js,int Num_len1,int Num_len2)415 {416int i;417if(Num_len1<Num_len2)418return -1;419bool bLarge=false;//长度相等的⼩于420if(Num_len1==Num_len2) {421for(i=Num_len1-1;i>=0;i--) {422if(bjs[i]>js[i])423 bLarge=true;424else if(bjs[i]<js[i]) {425if(!bLarge)426return -1;427 }428 }429 }430for(i=0;i<Num_len1;i++) {431 bjs[i] -= js[i];432if(bjs[i]<0) {433 bjs[i] += 10;434 bjs[i+1]--;435 }436 }437for(i=Num_len1-1;i>=0;i--)438if(bjs[i])439return i+1;//返回长度加1440return0;441 }442//计算阶乘函数443int Fac(int n,int result[])444 {445int i,j,k,jw,t;446 result[0]=1;447for(k=1, i=1;i<=n;i++){448for(jw=0, j=0;j<k;j++){449 t = result[j]*i + jw;450 result[j] = t%10;451 jw = t/10;452 }453while(jw)//直到上⼀个阶乘结果处理完后,将结果数组扩⼤,存进进位数即可454 {455 result[++k -1]= jw%10;456 jw /= 10;457 }458 }459return k-1;460 }461//⽐较函数462int IsBig_num(char str1[],char str2[])463 {464int Num_len1,Num_len2;465 Num_len1=strlen(str1);466 Num_len2=strlen(str2);467if(Num_len1<Num_len2)468return -1;469else470 {471if(Num_len1==Num_len2)472 {473if(strcmp(str1,str2)==0)474return0;475else476 {477if(strcmp(str1,str2)<0)478return -1;479else480return1;481 }。
程序设计报告( 2010 / 2011学年第一学期 ) 题目:大整数阶乘专业计算机科学与技术学生姓名张赛班级学号B09040121指导教师杨一涛指导单位计算机学院日期2010、9、30大整数阶乘一、课题内容与要求1、系统的基本功能及要求(1)写一个类BigInteger,并有如下成员函数operator+/ operator-/ operator*/ operator\,即整数的四则运算并重载运算符。
(2)用该大整数计算n的阶乘并显示出来。
(n∈[1,100])注:为了简化,可不考虑负数,则遇上形如“2-4”这样的表达式需要报错。
2、程序执行过程(1)系统从键盘读入自然数n,直到输入了合法的n为止。
(2)输出运算的结果,为便于观察结果,每输出四位中间插入空格,格式如下(例如,n=12):12!= 4790 0160 0(3)询问用户就是否继续进行,用户选择“就是”,直到输入合法为止,转(1),否则退出程序。
3、算法要求及提示(1)因为n较大时,n!的结果将超出长整形的保存范围,因此结果不能用long int 型的变量来保存。
本算法要求用链表来存储。
(2)链表的每一个节点存储结果的一位数字,因此结果的输出实际上就是链表的遍历问题,同时要先考虑用多少位来表示大整数。
4、其她要求(1)输入时具备一定的容错性判断,如输入的不就是数字,或输入的数超过范围等等。
(2)变量、函数命名符合规范。
(3)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
(4)程序的层次清晰,可读性强。
二、需求分析1)课题要求已说明结果不能用long int型的变量来保存,要求用链表来存储。
,首先要定义一个节点类,在这里定义一个双向节点类。
2)定义一个BigInteger大整数类,使其能够存放大数阶乘,并实现其的四则运算。
3)对输入整数的合法性进行检查,必须考虑用户各种输入情况。
三、概要设计1.使用单链表存储数据,结点类定义如下:class Node{int data;Node* next;//指向大数的高位Node* pre;//指向大数的低位friend class BigInteger;};2、使用大整数类来进行大整数四则算法的重载,在主函数中通过定义大整数对象调用,大整数类定义如下:class BigInteger//定义大整数类{public:Node *head,*head1;int n,temp,i,jinwei;BigInteger();//无参构造函数~BigInteger();//析构函数void jiecheng();//阶乘函数void operator +( BigInteger p1);//加法运算重载声明void operator -( BigInteger p1);//减法运算重载声明void operator *( BigInteger p1);//乘法运算重载声明void operator /( BigInteger p1);//除法运算重载声明};3、算法设计说明:因为n较大时,n!的结果将超出长整形的保存范围,因此结果不能用long int型的变量来保存。
本算法数据用单链表来存储。
链表的每一个节点存储结果的一位数字,因此结果的输出实际上就是链表的遍历问题,同时要先考虑用多少位来表示大整数。
首先申请一个结点类并赋数据域初值1,然后遍历单链表逐个的数据域与i(1到n)相乘;乘完后重新遍历,对每个结点的数据域处理,若小于10则跳过;否则,判断下一结点就是否存在,若存在则该数据域除10取余,下一结点的数据域加上该数据域除10的结果,若不存在则申请新结点空间,处理同上;全部乘完并处理完后,遍历单链表并输出各自的数据域即可,注意每四个输出一个空格。
4、流程图就是四、详细设计1、阶乘函数作为BigInteger类中的函数,在主函数通过定义大整数类对象调用,阶乘函数的定义如下:void BigInteger::jiecheng(){Node *cur,*cc;Node *head=new Node;//存放第一个节点,值为1head->data=1;head->pre=head->next=NULL;for(i=2;i<=n;i++)//从2开始连乘到n{cur=head;jinwei=0;while(1){temp=i*(cur->data)+jinwei;cur->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur->next==NULL)break;cur=cur->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc=new Node;cc->data=jinwei%10;cc->pre=cur;cc->next=NULL;cur->next=cc;cur=cc;jinwei/=10;}}cout<<n<<"!= ";cur=head,i=0;while(cur->next)cur=cur->next;//遍历到最高位while(cur)//从最高位到最低位打印{cc=cur;if(i==4){i=0;cout<<' ';}cout<<cur->data;cur=cur->pre;i++;delete cc;}}2.阶乘加法函数的重载定义:void BigInteger::operator +( BigInteger p1) {Node *cur,*cc,*cur1,*cc1;head=new Node;//存放第一个节点,值为1head->data=1;head->pre=head->next=NULL;for(i=2;i<=n;i++)//从2开始连乘到n{cur=head;jinwei=0;while(1){temp=i*(cur->data)+jinwei;cur->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur->next==NULL)break;cur=cur->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc=new Node;cc->data=jinwei%10;cc->pre=cur;cc->next=NULL;cur->next=cc;cur=cc;jinwei/=10;}}head1=new Node;//存放第一个节点,值为1head1->data=1;head1->pre=head1->next=NULL;for(i=2;i<=p1、n;i++)//从2开始连乘到n{cur1=head1;jinwei=0;while(1){temp=i*(cur1->data)+jinwei;cur1->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur1->next==NULL)break;cur1=cur1->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc1=new Node;cc1->data=jinwei%10;cc1->pre=cur1;cc1->next=NULL;cur1->next=cc1;cur1=cc1;jinwei/=10;}}if(n>p1、n)//若this、n大于等于p1、n{cur=head;cur1=head1;while(cur&&cur1)//同时遍历两个单链表,其中有一个结束就停止遍历{cur->data+=cur1->data;//cur的数据域等于cur的数据域与cur1的数据域的与cur=cur->next;cur1=cur1->next;}cur=head;//cur指向头结点do//利用阶乘函数中的算法处理单链表各个节点的数据域{if(cur->data<10)continue;if(cur->data>=10){if(cur->next){ cur->next->data+=cur->data/10;cur->data=cur->data%10;}else{Node *q=new Node;q->next=cur->next;cur->next=q;q->data+=cur->data/10;cur->data=cur->data%10;}}}while(cur=cur->next);cur=head,i=0;while(cur->next)cur=cur->next;//遍历到最高位while(cur)//从最高位到最低位打印{cc=cur;if(i==4) //每输出四个空一格{i=0;cout<<' ';}cout<<cur->data;cur=cur->pre;i++;delete cc;}}else{cur=head;cur1=head1;while(cur&&cur1)//同时遍历两个单链表,其中有一个结束就停止遍历{cur1->data+=cur->data;//cur1的数据域等于cur1的数据域与m的数据域的与cur1=cur1->next;cur=cur->next;}cur1=head1;do//利用阶乘函数中的算法处理单链表各个节点的数据域{if(cur1->data<10)continue;if(cur1->data>=10){if(cur1->next){cur1->next->data+=cur1->data/10;cur1->data=cur1->data%10;}else{Node *q=new Node;q->data=0;q->next=cur1->next;cur1->next=q;q->pre=cur1;q->data+=cur1->data/10;cur1->data=cur1->data%10;}}}while(cur1=cur1->next);cur1=head1,i=0;while(cur1->next)cur1=cur1->next;//遍历到最高位while(cur1)//从最高位到最低位打印{cc=cur1;if(i==4) //每输出四个空一格{i=0;cout<<' ';}cout<<cur1->data;cur1=cur1->pre;i++; delete cc;}}}3.阶乘减法函数的重载定义:void BigInteger::operator -( BigInteger p1){if(n==p1、n)//若this、n等于p1、n{cout<<"0";}else//若this、n不等于p1、n{Node *cur,*cc,*cur1,*cc1;head=new Node;//存放第一个节点,值为1head->data=1;head->pre=head->next=NULL;for(i=2;i<=n;i++)//从2开始连乘到n{cur=head;jinwei=0;while(1){temp=i*(cur->data)+jinwei;cur->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur->next==NULL)break;cur=cur->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc=new Node;cc->data=jinwei%10;cc->pre=cur;cc->next=NULL;cur->next=cc;cur=cc;jinwei/=10;}}head1=new Node;//存放第一个节点,值为1head1->data=1;head1->pre=head1->next=NULL;for(i=2;i<=p1、n;i++)//从2开始连乘到n{cur1=head1;jinwei=0;while(1){temp=i*(cur1->data)+jinwei;cur1->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur1->next==NULL)break;cur1=cur1->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc1=new Node;cc1->data=jinwei%10;cc1->pre=cur1;cc1->next=NULL;cur1->next=cc1;cur1=cc1;jinwei/=10;}}if(n>p1、n)//若this、n大于p1、n{cur=head;cur1=head1;while(cur&&cur1)//同时遍历两个单链表,其中有一个结束就停止遍历{cur->data-=cur1->data;cur=cur->next;cur1=cur1->next;}cur=head;do//遍历单链表{if(cur->data<0)//若p的数据域小于0{cur->next->data-=1;//p的后继结点的数据域减1cur->data+=10;//p的数据域加10}}while(cur=cur->next);cur=head,i=0;while(cur->next)cur=cur->next;//遍历到最高位while(cur)//从最高位到最低位打印{cc=cur;if(i==4) //每输出四个空一格{i=0;cout<<' ';}cout<<cur->data;cur=cur->pre;i++;delete cc;}}else{cur=head;cur1=head1;while(cur&&cur1)//同时遍历两个单链表,其中有一个结束就停止遍历{cur1->data-=cur->data;cur1=cur1->next;cur=cur->next;}cur1=head1;do//遍历单链表{if(cur1->data<0&&cur1->next)//若cur1的数据域小于0{cur1->next->data-=1;//cur1的后继结点的数据域减1cur1->data+=10;//cur1的数据域加10}}while(cur1=cur1->next);cur1=head1,i=0;while(cur1->next)cur1=cur1->next;//遍历到最高位cout<<"-";while(cur1)//从最高位到最低位打印{cc1=cur1;if(i==4) //每输出四个空一格{i=0;cout<<' ';} cout<<cur1->data;cur1=cur1->pre;i++;delete cc1;}}}}4.阶乘乘法函数重载的定义:void BigInteger::operator *( BigInteger p1){Node *cur,*cur1,*cc,*cc1;head=new Node;//存放第一个节点,值为1head->data=1;head->pre=head->next=NULL;for(i=2;i<=n;i++)//从2开始连乘到n{cur=head;jinwei=0;while(1){temp=i*(cur->data)+jinwei;cur->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur->next==NULL)break;cur=cur->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc=new Node;cc->data=jinwei%10;cc->pre=cur;cc->next=NULL;cur->next=cc;cur=cc;jinwei/=10;}}for(i=1;i<=p1、n;i++)//从2开始连乘到n{cur1=head;jinwei=0;while(1){temp=i*(cur1->data)+jinwei;cur1->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur1->next==NULL)break;cur1=cur1->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc1=new Node;cc1->data=jinwei%10;cc1->pre=cur1;cc1->next=NULL;cur1->next=cc1;cur1=cc1;jinwei/=10;}}cur1=head,i=0;while(cur1->next)cur1=cur1->next;//遍历到最高位while(cur1)//从最高位到最低位打印{cc1=cur1;if(i==4) //每输出四个空一格{i=0;cout<<' ';}cout<<cur1->data;cur1=cur1->pre;i++;delete cc1;}}5.阶乘除法函数重载的定义:void BigInteger::operator/(BigInteger p1){if(n==p1、n)//若this、n等于p1、n{cout<<"1"<<endl;}elseif(n<p1、n){cout<<"0"<<endl;}if(n>p1、n){Node *cur,*cc;head=new Node;//存放第一个节点,值为1head->data=1;head->pre=head->next=NULL;for(i=p1、n+1;i<=n;i++)//从p1、n开始连乘到n{cur=head;jinwei=0;while(1){temp=i*(cur->data)+jinwei;cur->data=temp%10;//取个位存下来,如91*2=182,取2存储jinwei=temp/10;//十位与百位作为进位,取18为进位if(cur->next==NULL)break;cur=cur->next;}while(jinwei!=0)//如果乘完一个i发现还有进位,就必须新增结点,由于进位可能就是多位数,所以必须用//while{cc=new Node;cc->data=jinwei%10;cc->pre=cur;cc->next=NULL;cur->next=cc;cur=cc;jinwei/=10;}}cur=head,i=0;while(cur->next)cur=cur->next;//遍历到最高位while(cur)//从最高位到最低位打印{cc=cur;if(i==4) //每输出四个空一格{i=0;cout<<' ';}cout<<cur->data;cur=cur->pre;i++; delete cc;}}}五、数据测试及其结果分析1.数据测试测试界面:输入错误整数: 123输入正确整数: 12接着输入y接着输入5接着输入n接着输入6接着输入52、结果分析:刚开始运行,程序首先提示用户程序就是计算大整数的阶乘及其四则运算的功能,并提示用户按照输入一个自然数;如果输入的数大于100或小于1,则提示用户输入错误;若输入正确,则进行阶乘运算,输出结果,然后提示用户就是否继续,若继续,则提示用户输入自然数n,继续进行阶乘运算,否则,则以下进入大整数阶乘的四则运算,提示输入第一运算对象的n值;若输入不正确,则提示用户重新输入,直至正确为止,然后提示用户输入第二运算对象的n值,若输入不正确,则提示用户重新输入,直至正确为止,然后则输出四则运算的结果。