大数阶乘实习报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

{

相关文档
最新文档