一、问题描述

大数运算——计算n的阶乘 (n≥20)。

【基本要求】

  • (1)数据的表示和存储:
    ①累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求。
    ②试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。
  • (2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值;在屏幕上显示最终计算结果。【测试数据】
    (1)n=20,n!=2432902008176640000
    (2)n=30,n!=265252859812191058636308480000000,

【实现提示】

  • (1)设计数据的存储结构:
    介于阶乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或结点存储数据的若干位数值。从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。
  • (2)实现两个数的乘法运算需考虑:乘数的各位数都要与被乘数进行乘法运算;乘法过程中的进位问题及其实现。因每个元素或结点最多存储数据的3位数值,故当元素或结点中的数值大于999,需向前一个元素或结点进位。

二、需求分析

计算阶乘时如果直接用一个整形来存结果则容易发生溢出(由题目所给的测试数据易得,30的阶乘就已经高达三十多位),所以就有必要设计一种存储结构来存阶乘得到的值,由学过的知识容易想到可以利用链表来存储,链表的每一个节点内存储特定的几位数,由于链表是可以无限延长的 所以链表能存储的数的位数也是无限长的。
所以现在我们设计一个程序,由用户输入其需要计算的阶乘的数字,程序计算出的阶乘的结果对应的呈现在屏幕上。

三、设计

3.1 整体设计

用struct设计节点类方便访问,再设计链表类定义数据成员和构造函数并声明打印函数和阶乘函数为其友元函数,定义阶乘函数和打印函数用来计算阶乘

3.2 详细设计

  • 节点类:用struct设计节点类,设计数据域data和指针域link,设计两个构造函数,一个无参构造函数初始指针域为NULL,一个含一个变量a的构造函数初始指针域为NULL数据域为a。
    链表类:设计一个数据成员为节点类类型的指针,设计两个构造函数
  • 阶乘函数:
    i从一到二十逐步加一,C指针指向链表头节点,进位表示为Out
    如果C指针不为空则循环以下语句
    节点新的值=旧的值*i + 进位
    进位=当前节点值/1000 (高位的1代表低位的1000)
    当前值对1000取余(保证只存三位数,剩下的值由Out传给高位)
    在当前节点处理完后 判断是否需要增加节点
    (进位不为零且后继为空则创建一个后继节点)
    C指针向后指一位
  • 打印函数:
    如果当前指针指向节点的指针域为空,则打印此节点的数据
    否则1,打印后继节点 2,输出当前节点数据(位宽为三,空位补0)

四、测试数据及测试结果:

测试输入:-5,20,30,1000
测试目的:设计该输入的目的在于测试程序在哪方面可能存在漏洞;

4.1:-5的计算
正确输出:输入有误,请重新输入一个自然数
实际输出:输入有误,请重新输入一个自然数

4.2: 0的计算
正确输出:1
实际输出:1

4.3:20的计算
正确输出:2432902008176640000
实际输出:2432902008176640000

4.4:30的计算
正确输出:265252859812191058636308480000000
实际输出:265252859812191058636308480000000

4.5:1000的计算
输出结果较长,此处省略
且经对比实际输出=正确输出

数据结构实验--大数运算之计算n的阶乘 (n≥20)相关推荐

  1. 大数运算_求1000的阶乘(C语言实现)

    以下是简易的代码,因为受数据类型的限制,所以表示的数据范围有限, 故在表示大数据的时候,应该采用数组存储. 同时,在采用数组存储的时候,应该将数组声明为全局变量或static修饰,这样做的目的是使分配 ...

  2. C语言学习趣事_之_大数运算_加法

    C语言学习趣事_大数运算_之加法 1.引子    在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...

  3. java中大数开方_Java中的大数运算

    # 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...

  4. 厦门理工C语言实验报告8,厦门理工c语言数据结构实验

    <厦门理工c语言数据结构实验>由会员分享,可在线阅读,更多相关<厦门理工c语言数据结构实验(15页珍藏版)>请在人人文库网上搜索. 1.数据结构实验报告 实验序号:6 实验项目 ...

  5. C语言大数运算-乘除法篇

    前言: 这是第三篇博客,也是一次介绍二个计算的博客,可能难度会比前两篇博客大一点,所以建议对于初学者来说一定要看完我的前两篇博客再来看本篇博客,关于本次实验的环境,和思想在第一篇博客已经简单介绍过了, ...

  6. 数据结构实验三 图的操作与实现

    系列文章: 数据结构实验一 线性表.堆栈和队列的操作与实现 数据结构实验二 二叉树的操作与实现 数据结构实验三 图的操作与实现 数据结构实验四 查找和排序算法实现 一.实验目的: 1.领会图的两种主要 ...

  7. SM2椭圆曲线公钥密码算法的C语言实现(基于Miracl大数运算库)

    SM2椭圆曲线公钥密码算法的C语言实现(基于Miracl大数运算库) 实验环境 预备知识 FpF_pFp​ 及椭圆曲线 素域 FpF_pFp​ FpF_pFp​ 上的椭圆曲线 FpF_pFp​ 上椭圆 ...

  8. 怎么用c语言进行大数运算

    在C语言中进行大数运算,一般有以下几种方式: 自己实现高精度计算库:通过定义自己的数据结构(比如用数组表示大整数)和实现基本的大数加减乘除等运算,可以实现高精度计算.但是这需要自己实现大量的代码,而且 ...

  9. 农夫过河【数据结构实验报告】

    数据结构实验报告 实验名称:实验三 农夫过河 学号:*** 姓名:gnosed 实验日期:2017.10.30 一.实验目的 1.进一步掌握队列的使用 2.会使用队列进行农夫过河解的搜索 二.实验具体 ...

最新文章

  1. Too many levels of symbolic links
  2. CentOS7上安装KVM部署虚拟机
  3. 【转】gdb调试多进程程序
  4. 百度之星初赛(1)解题报告
  5. php中add函数,php中addslashes()和addclashes()函数的区别分析
  6. 在护卫神上部署javaWeb项目,已经测试通过
  7. Java Fork / Join进行并行编程
  8. php图片案例,web开发N例-案例2:PHP绘制图片、绘制中文
  9. vue中如何实现用JavaScript调用函数的方式使用一个通用的通知组件
  10. css3 transition的各种ease效果
  11. python原理_强化学习:原理与Python实现
  12. 算法题003 斐波那契(Fibonacci)数列
  13. js 弹出提示信息,并跳转指定页面代码分享
  14. FLASHFTP简体中文破解版
  15. 主析取范式主合取范式
  16. 关于Virtual的英语含义
  17. 选择退化特征时,利用单调性、鲁棒性、预测性三指标选择(附matlab代码)
  18. ReacNative:报错Cannot add a child that doesn’t have a YogaNode to a parent without a measure function!
  19. linux开源网络教学系统,10 个顶尖的 Linux 开源人工智能工具
  20. Arduino-Proteus仿真04-LED交通灯仿真

热门文章

  1. NLP中词义消岐(WSD)的简介与实现
  2. pAdTy_5 构建可穿戴设备的应用程序
  3. 前端开发:JS中关于去重操作的使用
  4. codeforces contest 1092 -- D1 Great Vova Wall (Version 1)
  5. mysql 字符编码查询
  6. 2种方法恢复回收站已删除的文件,必看干货
  7. 十年IDF老兵:乍见之欢,久处不厌
  8. 云南大学计算机考研分数线2020,2021云南大学研究生分数线一览表(含2019-2020历年复试)...
  9. 雷达效果shader
  10. 新买了块翼联的AX200的网卡,结果开移动热点的时候遇到了点问题