大数计算器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 定位:得到指向第i个元素的前驱的指针p; • 修改指针:p.next:=p.next .next ;
二、 线性表的链式存储结构
2. 循环链表
循环链表的存储结构 令链表中最后一个结点的指针域指向头结点,使整个链表形 成一个环,称这样的链表为循环链表。 循环链表H=(a1,a2,...,an)逻辑表示为:
Student();
void setName(char *sname) Private: char* name; }
VC ++2005 开发环境介绍
第2讲 课程设计一
课程设计内容
题目:大整数计算器的设计与实现
设计内容:设计并实现一个简单计算器程序,该程序能实现
任意大整数的加减运算和(乘法运算*).
为了降低时间复杂度,必须减少乘法的次数。 T(n)=O(nlog3) =O(n1.59)较大的改进
3T (n / 2) O(n) n 1
XY = ac 2n + ((a-c)(b-d)+ac+bd) 2n/2 + bd 细节问题:两个XY的复杂度都是O(nlog3),但考虑到a+c,b+d可 2. XY = ac 2n + ((a+c)(b+d)-ac-bd) 2n/2 + 能得到m+1位的结果,使问题的规模变大,故不选择第2种方案。 bd
C++语言与编程工具使用回顾 课程设计一:大整数乘法器 课程设计二:文件压缩编/解码 综合课程设计:四川省交通质询模拟系统

第1讲 面向对象语 言及编程工具
C++数据类型
数据类型 基本数据类型 非基本数据类型 数 组 指 针 空类型 结 构 联 合 枚 举 类 type[ ] type * void struct union enum class
在C++中,可以用同一个函数名定义多个函数,而对不同 的实参数据类型作不同的运算,称这类函数为重载函数。 int abs(int); long abs(long); double abs(double); 根据调用函数中实参的数据类型可判断应该使用哪个 abs( )函数。 abs(10); //调用int abs(int) abs(-1000000); //调用long abs(long) abs(-12.34); //调用double abs(double)
H
a1
an
空表时:H= H.next;
二、 线性表的链式存储结构
3 双向链表 (double linked list)
双向链表的存储结构
双向链表中每一个结点有两个指针域:priou 和 next, priou指向直接前驱;next指向直接后继。 循环链表 L=(a1,a2,...,an)逻辑表示为:
{ //<派生类新成员的定义>
}
其中,派生类名是自定义的派生类名字,并且派生类是按 指定的继承方式派生的。继承方式有:
public private
公有继承 私有继承
protected 保护继承
2、多继承派生类的定义格式:
class <派生类名>:<继承方式1><基类名1>,
<继承方式2><基类名2>, …
Y = c 2n/2 + d
XY = ac 2n + (ad+bc) 2n/2 + bd
2 大整数的乘法
请设计一个有效的算法,可以进行两个n位大整数的乘法运算 小学的方法:O(n2) 效率太低 分治法: 复杂度分析 O(1) n 1 T2) + XY = ac (nn (ad+bc) 2n/2 + bd
间;根据用户选择进行加、减、乘*运算
计算器计算功能参考流程
从键盘输入1表示进行加法运算 ,输入2表示进行减法运算
然后从键盘出入数据A和数据B ,回车后,进行程序运算,得出运算结果
如果运算完毕,输入3,退出程序
本课程设计所涉及的基础知识
线性数据结构
大整数乘法算法
1 线性结构
线性表(linear_list)


Leabharlann Baidu
int
char w_char
单字符型 字符型 宽字符型 实 型
单精度型 双精度型 bool
float double
逻辑型
变量定义(Variable declaration) 程序中的变量必须先定义后使用,为 变量命名时 应符合标识符的规定。 1、变量定义方式 <类型> <变量名表>;

一、C++中函数的定义 定义的一般形式: 类型标识符 函数名(形式参数表) { 函数体 } 例如:
一、 线性表的顺序存储结构
2、插入和删除操作 1) 插入运算 INSERT(L, i, b)

插入前:L=(a1, ...
, ai-1, ai, ... ,an) , ai-1, b,
插入后:L=(a1, ... ai, ... ,an ) 算法思想:
① 进行合法性检查,1<=i<=n+1; ② 判断线性表是否已满; ③ 将第n个至第i个元素逐一后移一个单元; ④ 在第i个位置处插入新元素;
线性表是n个数据元素的有限序列,记为: L=(a1,a2, …,an)
数据元素之间的关系是:
ai-1领先于ai,ai领先于ai+1。 称ai-1是ai的直接前驱 元素;ai+1是ai的直接后继 元素。 除a1外,每个元素有且仅有一个直接前驱元素, 除an外,每个元素有且仅有一个直接后继元素。 线性表中数据元素的个数n(n>=0)称为线性表的长度, 当n=0时,称为空表。
C++中类的定义
//说明部分(类体)
class <类名>
{
public:
<公有段数据及成员函数>
protected:
<保护段数据及成员函数>
private:
<私有段数据及成员函数> } //实现部分 <各成员函数的实现>

关键字public、private、protected 为访问权限控制符 (Access Control),规定成员的访问权限,他们出现的顺 序和次数无限制;
int area_s(int a ,int b) { return(a*b) }
其中:
函数名—给自定义的函数取的名字。 形式参数表—函数被调用时,接收调用函数传递的实参数。
函数体—执行功能的语句块。
函数返回值—通过函数调用获得的函数返回值,其值由 return 语句返回。
重载函数(Overload Function)
具体描述为:利用线性数据结构实现长整数的存贮,线性数
据结构的每个结点含一个整型变量。输入、输出形式按简体中 文表示习惯,每四位一组,组间用逗号分隔。
程序基本要求:(1)要求可以存储两个无限大的整数 ;
(2)能够实现任意两个无限大的整数加减运算 (3)提高:实 现两个大整乘法
概要设计
1.数据结构:
一、线性表的顺序存储结构
1、顺序存储结构
用一组地址连续的存储单元依次存储线性表的 元素。设线性表的每个元素占用k个存储单元,则 第i个元素ai 的存储位置为:Loc(ai)=Loc(a1)+(i1)*k 其中,Loc(ai)为线性表的起址。
b b+k
a1 a2
b+(i-1)k b+(n-1)k
ai an
语言类课程设计
主讲讲师:林劼
联系方式:linjie@uestc.edu.cn
教学安排
总学时16学时,安排5次课程内容,学时分 别为4,3,3,3,3 具体上课时间根据实验室安排提前通知 考核方式:课程设计报告 成绩组成:20%小课程设计+10%考勤+70%综合课程
设计报告
教学内容

公有(public)成员提供了类的接口功能,不仅可以被成员 函数访问,而且可以在程序中被访问;
私有(private)成员是被类隐藏的数据,只有该类的成员 或友元函数才可以访问,通常将数据成员定义为私有成员; 保护(protected)成员具有公有成员或私有成员的特性。


C++对象的定义和成员表示
p
插 入 前
a s x
b
插 入 后
a s x
b
2 大整数的乘法**
小学的方法:O(n2) 分治法:
效率太低
b 1 n d 1 n
X= 复杂度分析 a O(1) T (n) Y= c 4T (n / 2) O(n)
T(n)=O(n2) 没有改进
X = a 2n/2 + b
对象是类的实例,任何一个对象都是属于某个已知类的。 对象定义格式如下: <类名> <对象名表>; 例如:定义Location 类的对象如下: Location a, b, c[10], *p; 其中:a, b 为两个一般对象; c[10]是对象数组; p是指向类Location 对象的指针。 对象的成员与它所属类的成员一样,有数据成员和成员函数。 创建对象时,每个对象的数据成员具有不同的存储空间,以 存放不同的数据,但成员函数的代码为每个对象所共享。
C++中 继承性和派生类
在C++ 中,继承分为单继承和多继承: 单继承——派生类只有一个直接基类的继承方式; 多继承——派生类有多个直接基类的继承方式。
如下图所示:
外部存储器
A X B 光盘 C Z 多继承 单继承 Y
硬盘
软盘
单继承
C++派生类的定义格式
1、单继承派生类的定义格式
class <派生类名>:<继承方式><基类名>
⑤ 将表的长度加1。
一、线性表的顺序存储结构
2)删除运算DELETE(L,i)
删除前:L=(a1,...,ai-1,ai,ai+1,...,an) 删除后:L=(a1,...,ai-1,ai+1,...,an)

算法思想: ① 进行合法性检查,i是否满足1<=i<=n; ② 判线性表是否已空,v.last=0; ③ 将第i+1至第n个元素逐一向前移一个位置; ④ 将表的长度减1。
二、 线性表的链式存储结构
1. 线性链表
1) 链式存储结构 用一组任意的存储单元(不要求地址连续)来存储线性表的 元素,每个元素对应一组存储单元(称为结点),每个结点包括 两个域:存储数据元素信息的数据域 和存储直接后继所在位置的 指针域。 N个结点通过指针域组成的表,称为线性链表(单链表)。 • 线性链表最后一个结点的指针域为“空”(NULL);
p
x s b y
插入后:
p x s b y
插入运算可以由定位和修改指针来完成:
定位:得到指向y的前驱的指针p;
修改指针:s.next:=p.next; p.next:=s; {顺序不可换}
二、 线性表的链式存储结构
3) DELETE(L,i)删除运算
p
p
删除前
删除后
删除运算可以由定位和修改指针来完成:
在程序中使用一种线性结构,如双向链表来存储大整数。 2.程序模块
程序可以设计为以下三大部分来实现
(1)数据定义:大数节点结构类型的定义 (2)核心类:线性数据结构类;运算类;主控制类
(3)核心函数实现:大整数创建函数;大整数的加法函数;大
整数减法函数;大整数乘法函数* (4)主控制程序:输入两个待计算的大整数,并创建内存空
1.以类作为程序组成单元 2.程序以*.h与*.cpp文件组成 3.h文件为头文件包含类的定义,CPP为具体类的实现文件。
A.h #include “stdio.h” Class Student { Public: A.cpp #include “A.h” Student:: Student() {}; void Student::setName(char *sname) { Strcpy(sname,name); }
• 用一个头指针指示链表中第一个结点的存储位置;
• 链表L=(a1,a2,...,an)逻辑表示为: L
a1 a2 an NIL
空表时:L=NULL
二、
线性表的链式存储结构
2).INSERT(L,i,b)插入运算 设在单链表结点x和结点y之间插入新结点b,已知p为指 向结点x的指针,s为指向新结点b的指针。 插入前:
{
//派生类的类体
}
多继承派生类的构造函数格式: <派生类名>(<总参数表>):<基类名1>(<参数表1>), <基类名2>(<参数表2>), <子对象名3>(<参数表3>), …
{
//派生类构造函数
}
执行顺序:先执行所有基类的构造函数,再执行派生类本身的 构造函数,包含子对象在内。
C++ 程序结构
an
L
a1
二、 线性表的链式存储结构
在双向链表中,查找某结点直接前驱PRIOR(L,elem)和直接 后继NEXT(L,elem)的运算的时间复杂度均为O(1)。 • 空表时: L.priou=L.next=NULL • 双向链表也可以首尾相连构成双向循环链表。空双向循环 链表满足L .priou=L.next=L。 • 在双向链表中,除插入、删除操作差别较大外,其它基本 运算均与单链表相同。在P结点之前插入S结点应做如下修改 动作: p.priou.next:=s;s.priou:=p.priou; p.priou:=s; s.next:=p;
相关文档
最新文档