单链表实现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。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值