终于等到你

众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

单链表实现n(n≥20)的阶乘

n(n≥20)的阶乘

基本要求

  • 数据的表示和存储:
    累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求。
    试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。
  • 数据的操作及其实现:
    基于设计的存储结构实现乘法操作,要求从键盘上输入n值;在屏幕上显示最终计算结果
  • 从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构

用单链表实现数据的动态存储

结构体类定义

struct LinkNode
{
	int element;
	LinkNode* next;
	LinkNode() { this->next = NULL; this->element = 0; }
	LinkNode(int element) { this->element = element; }
};

class Link
{
public:
	Link() {};
	~Link() {};
	Link(int n);
	void factorial();
	void output();
private:
	LinkNode * head;
	int n;

};

主要函数,配上核心代码,详细注释

//构造函数,
Link::Link(int n)
{
	this->n = n;
	head = new LinkNode();
	head->element = 1;
}
//核心代码,一个节点保存三位
void Link::factorial()
{
	int flag;
	for (int i = 1; i <= n; ++i)//处理1~n的乘法
	{
		LinkNode* current = head;
		flag = 0;//初始化
		while (current != NULL)
		{
			current->element = i * (current->element) + flag;//当前的值*i 加低位的进位
			//如何当前值大于1000,即需要进位,如果当前的current->next == NULL,说明需要拓展节点
			if (current->element >= 1000 && current->next == NULL)
			{
				current->next = new LinkNode();
			}
			//flag作为上一位进位的数值
			flag = current->element / 1000;
			//当前的值处理一下,保证小于1000
			current->element = current->element % 1000;
			//下一个节点
			current = current->next;
		}
	}
}
//输出函数,调用print(headNode)
void Link::output()
{
	print(head);
}
//递归实现输出,逆序输出,实现正常的数据顺序
void print(LinkNode * node)
{
	if (node != NULL) {
		print(node->next);
		if (node->next == NULL)//如果是第一位,直接输入保存的数据
			printf("%d", node->element);
		//因为后面保存的数据可以为000,所以格式控制输出
	else printf("%03d", node->element);
	}
	return;
}

结束啦!!!

思路写法主要来自大佬Chunibyo,大佬tql。

posted @ 2018-11-17 10:22  gzr2018  阅读(759)  评论(0编辑  收藏  举报