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。