大数阶乘数据结构算法课程设计 副本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习题目一
线性表及其应用
【问题描述】
大数运算——计算n的阶乘(n>=20)。
【基本要求】
(1)数据的表示和存储;
(1.1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;
(1.2)试设计合适的存储结构,要求每个元素或节点最多存储数据的3位数值。(2)数据的操作及其实现:
基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。
【实现提示】
(1)设计数据的存储结构:
介于阶乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或节点存储数据的若干位数值。
从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。
(2)数据的操作及其实现:
(2.1)累积运算的特点是当前的计算结果是下次乘法运算的乘数;
(2.2)实现两个数的乘法运算须考虑:
(1)乘数的各位数都要与被乘数进行乘法运算;
(2)乘法过程中的进位问题及其实现;
(3)因每个元素或节点最多存储数据的3位数值,故当元素或节点中的数值大于999,需向前一个元素或节点进位。
【实现结构】
(1)采用链式存储结构实现(普通单链表,循环单链表,普通双项链表和双向循环链表中任选一种结构)。
(2)采用动态数组实现。
【实现程序】
#include "stdafx.h"
#include
using namespace std;
template
class Chain;
template
class ChainNode
{
friend Chain
private:
T data;
ChainNode
};
template
class Chain
{
public:
Chain(){first=0;};
~Chain();
bool IsEmpty()const{return first==0;}
int Length()const;
bool Find(int k,T&x) ;
Chain
Chain
Chain
Chain
int OutPut();
private:
ChainNode
};
/**************析构函数(删除链表的所有节点)********************/ template
Chain
{
ChainNode
while(first)
{
next=first->link;
delete first;
first=next;
}
}
/**********************确定链表的长度*****************************/ template
int Chain
{
ChainNode
int len=0;
while(current)
{
len++;
current=current->link;
}
return len;
}
/*********************在链表中查找第K个元素*************************/ template
bool Chain
{
ChainNode
int index=0;
while(index { current=current->link; index++; } if(current) {x=current->data;return true;} return false; } /*********************向链表中插入元素*************************/ template Chain { ChainNode for(int index=1;index p=p->link; ChainNode y->data=x; if(k){ y->link=p->link; p->link=y;} else { y->link=first; first=y; } return *this; } /********************改变链表第k个元素的值***********************/ template Chain { ChainNode for(int index=0;p&&index { p=p->link;