单链表实现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。
单链表实现n(n≥20)的阶乘的更多相关文章
- PTA之求单链表结点的阶乘和
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int ...
- PTA基础编程题目集6-6求单链表结点的阶乘和(函数题)
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义 ...
- 数据结构C语言实现系列——线性表(线性表链接存储(单链表))
#include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...
- 63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]
[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向. ...
- 用java简单的实现单链表的基本操作
package com.tyxh.link; //节点类 public class Node { protected Node next; //指针域 protected int data;//数据域 ...
- Java: 实现顺序表和单链表的快速排序
快速排序 快速排序原理 快速排序(Quick Sort)的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到 ...
- 008实现一个算法从一个单链表中返回倒数第n个元素(keep it up)
我们维护两个指针, 它们之间的距离为n. 然后.我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变. 那么, 当第二个指针指到空时.第一个指针即为所求. #include <ios ...
- "《算法导论》之‘线性表’":基于指针实现的单链表
对于单链表的介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1. 单链表介绍 单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针. ...
随机推荐
- VirtualBox安装64位系统
2010-04-29 到引导区报错: This kernel requires an X86-64 CPU,but only detected an i686 CPU. 以我小学水平的英语理解 ...
- hihocoder第237周:三等分带权树
题目链接 问题描述 给定一棵树,树中每个结点权值为[-100,100]之间的整数.树中包含结点总数不超过1e5.任选两个非根节点A.B,将这两个结点与其父节点断开,可以得到三棵子树.现要求三棵子树的权 ...
- 【LeetCode】242. Valid Anagram (2 solutions)
Valid Anagram Given two strings s and t, write a function to determine if t is an anagram of s. For ...
- 谈谈MySQL死锁 一
数据越来越和我们的生活离不开,数据在生命周期的各个阶段有着不同的痛点和需求以及特殊场景. CURD是数据的四大基本需求:写入,更新,读取,删除. 今天,来谈一谈死锁问题 死锁是高并发下MySQL不可回 ...
- Shell函数的7种用法介绍
1. 在shell文件内部定义函数并引用: 复制代码代码如下: [~/shell/function]# cat factorial.sh #!/bin/bashfunction factorial{f ...
- 关于c语言的左移运算
对于任意w位的二进制,进行k位的移动时,真实的位移量为k mod w 32bit的例子 1 << 1 结果2 1 mod 32 => 11 << 32 结果1 32 mo ...
- Android开发(二十三)——Application
参考: [1] Android中Application类用法.http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.htm ...
- 【iCore4 双核心板_FPGA】例程一:GPIO输出实验——点亮LED
实验现象: 三色LED循环点亮. 核心源代码: module led_ctrl( input clk_25m, input rst_n, output fpga_ledr, output fpga_l ...
- Loadrunner C/S关联函数(LSP)AND(LSSS)使用-案例
LSP就是lrs_save_param()函数 LSSS就是lrs_save_searched_string()函数 一下我们用一个例子去说明他们的使用. C/S机制和B/S不一样,特别是有一个dat ...
- 多线程开发之三 GCD
NSThread.NSOperation.GCD 总结: 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU 空闲时就会执行) 更新 UI 应该在 ...