大数阶乘实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大数的阶乘
【1】问题的描述:
对于一个数的阶乘算法应该是有好多中算法,运用递归调用函数、指针等都可以实现,但是对于运算结果的存储是一个问题,对于一个数比较小,我们可以用数组或者字符串来存储该结果,但是如果对于一个大数的运算时,那么则不仅仅是一个数组可以解决的,为了储存的方便,可以运用单链表来解决相应的存储问题。
【2】求解思路:
首先定义一个单链表,用来存储数的结果。在计算的大数的阶乘时运用递归调用的方法来实现,在运算较大的数时,其中间变量也是存在该链表中,即在运算的同时完成存贮的过程,但是在存一个较大数的同时,考虑到位和进位的问题,在链表中定义了相应的函数来实现,即find和search和change函数。
【3】采用的数据结构:
采用的数据结构为单链表。
【4】程序实现说明:
class ChainNode //结点类的定义
class Chain //链表类的定义
boolIsEmpty() const {return first == 0;} //判断是否为空链表
int Length() const; //计算链表的长度
bool Find(int k, int& x); //取出第k个元素
int Search(constint& x) const; //寻找数据为x的元素
Chain& Change(int k, int x); //修改第k个元素的值
Chain& Delete(int k, int& x); //删除第k个元素
Chain& Insert(int k, constint& x); //在第k个元素后插入一个元素x void Output(); //输出
//改为递归,才能先输出高位后输出低位
void Chain::OutputOne(constChainNode* current)
//先做乘法
for(j = 0; j { c.Find(j,k); k = i * k; c.Change(j,k); } //然后处理进位 for(j = 0; j { c.Find(j,k); if(k >= 1000) { if (j c.Find(j+1,l); else { c.Insert(j+1, 0); //增加高位 l = 0; } l += k/1000; c.Change(j+1,l); k = k % 1000; c.Change(j,k); 【5】程序清单: // cpp.cpp : 定义控制台应用程序的入口点。 //单链表的运用来实现大数的阶乘!!!! #include "stdafx.h" #include #include using namespace std; class ChainNode //结点类的定义 { friend class Chain; private: int data; //数据元素域ChainNode* link; //链指针域}; class Chain //链表类的定义{ public: Chain(){first = 0;} //构造函数对头指针初始化为0 ~Chain(); boolIsEmpty() const {return first == 0;} //判断是否为空链表 int Length() const; //计算链表的长度 bool Find(int k, int& x); //取出第k个元素 int Search(constint& x) const; //寻找数据为x的元素 Chain& Change(int k, int x); //修改第k个元素的值 Chain& Delete(int k, int& x); //删除第k个元素 Chain& Insert(int k, constint& x); //在第k个元素后插入一个元素x void Output(); //输出 void OutputOne(constChainNode* current); private: ChainNode* first; //私有数据为头指针 }; Chain::~Chain() //链表的析构函数 { ChainNode * next; //定义一个临时指针来在删除first指针时防止后续结点的丢失while(first) { next = first->link; delete first; first = next; } } int Chain::Length() const { ChainNode* current = first; //这个由于是定义的常成员函数,因此在访问时不能通过该函数来改变私有数据first的值,故定义一个与first功能相同的current的指针 intlen = 0; while(current) { len++; current = current->link; } return len; } bool Chain::Find(intk,int& x) {