大整数阶乘程序设计_B09040121

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18: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)对输入整数的合法性进行检查,必须考虑用户各种输入情况。

三.概要设计

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;//存放第一个节点,值为1

head->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<

相关文档
最新文档