大整数计算实验报告

石家庄经济学院实验报告学院: 信息工程学院专业: 计算机科学技术计算机人论坛1.需求分析1.1开发背景在现实生活中不可避免地我们会遇到一些超大整数之间的运算,比如要计算马云的资产,以及国有银行的转账收入支出等一些数的存储等等类似的问题,而由于计算机整形数的最小值和最大值范围仅为-32768到32767,所以关于大整数的实验即呼之欲出,本实验就是针对数值很大、精度很高的大整数进行的加法减法以及乘法的计算。

1.2数据需求指针:L1,L2:分别为指向这两条存储要进行运算的链表头结点的指针;L3:指向乘法的结果链表;L4:在运算乘法的时候做中间量使用。

prior:双向链表的头指针;next:双向链表的尾指针。

data:整形数,链表所存的数据。

1.3功能需求对一个进行运算的软件,加法和减法是最基本的运算,本实验又额外增加了大整数的乘法。

1.4测试数据第一个数:9,568,974,512;第二个数:8,648,761,512;2.概要设计2.1功能模块图由需求分析可画出如下功能模块图。

图2-1 功能模块图2.2各功能子程序定义1.创建链表:Status creat(DuLinkList &L,char str[30]);2.输出链表中结点内的数据:Status output(DuLinkList L);3.加法:DulNode *Add(DuLinkList L1,DuLinkList L2);4.减法:DulNode *Sub(DuLinkList L1,DuLinkList L2);5.乘法:DulNode *Mul(DuLinkList L1,DuLinkList L2);计算机人论坛2.3主界面截图图2-3 程序主界面3.详细设计3.1数据结构设计此款软件是基于线性表双向链表完成的,在每个分过程中都充分利用了链表指针灵活又不太易于掌控的特性,但若是全面理解指针以及链表的特点,也是很容易设计此款软件的。

在大整数加减乘法软件中主要有以下几种数据(1)Status, ElemType都是宏定义的整形量;(2)DulNode是结构体,包含三个域,data,prior,next,分别是整形数,左指针,右指针;3.2模块详细设计由于加法和减法的操作易于实现,在此并不一一赘述。

乘法的实现:(1)构思:本函数又另设一个指针L3和L4,L3用于存储每一层的乘法结果,L4则每次都加上L3链表,直至结束,最后L4指向的链表即为乘法的结果。

(2)一级算法:P1和p2分别指向L1和L2结点的下一个结点遍历L1和L2,分别计算两链表的长度若L2长于L1,则分别交换L1和L2,p1和p2。

新建结点L3和L4,p3和q分别指向L3指向的结点。

Do{计算L3链表}为L3加上头结点;把L3赋给L4;P1重新置于L1尾部,p2前移一位;Do{重新做一条L3链;Do{计算L3链}当p1->next为NULLW指向L3链尾;把L3加到L4上;}当p2->prior为空返回L4;(3)二级求精:L3->data = 上一位的进位加上L1结点加上L2结点;计算Prov;新建L3->prior;计算L3结点数据;P1前移计算机人论坛3.3测试与运行本程序是用C语言在VisualC++环境编译所完成,经部分数据验证无误,现将测试与运行结果展示如下:(1)加法:图3-3-1 加法(2)减法和乘法:图3-3-2 减法和乘法(3)输入:图3-3-3 输入计算机人论坛4.总结与展望《数据结构》果然不是闹着玩的,要想学好,必须得下苦功夫!!!5.参考文献[1].严蔚敏.数据结构[M].北京:清华大学出版社,2013。

计算机人论坛6.源代码清单#include<stdio.h>#include<stdlib.h>#include"max_tou.h"Status input(LinkList &p){LinkList head,s;int v;int tamp;tamp=0;head=(LinkList)malloc(sizeof(LNode));p=head;while(tamp==0) /*创建n个元素的双向链表*/{scanf("%d",&v); /*束三个三个输入*/if (v>=0){s=(LinkList)malloc(sizeof(LNode));s->data=v; /*赋值*/p->next=s; /*连接*/s->prior=p;p=s;}elsetamp=1; /*为负数时结束*/ }head=head->next; /*去掉头节点*/head->prior=NULL; /*让双向链表前后都为空*/p->next=NULL;return OK;}Status output(LinkList &p,LinkList &head) /*输出*/{LinkList s;s=head;while(s!=NULL){if(s->data>=100) printf("%d",&s->data);if(s->data>=10 && s->data<100) printf("0%d",&s->data);if(s->data>0 && s->data<10) printf("00%d",&s->data);s=s->next;}return OK;}Status max_add(LinkList &head1,LinkList &head2,LinkList &p1,LinkList&p2) /*链表加法*/{LinkList p,q;int n=0,m=0;p=head1;q=head2;while(p!=NULL) /*遍历链表然后记录链表长度*/{n=n+1;p=p->next;}while(q!=NULL) /*遍历链表然后记录链表长度*/{m=m+1;q=q->next;}p=p->prior;q=q->prior;if(n>=m) /*当head1 大于head2时*/{while(q!=NULL){p->data=p->data+q->data; /*两个链表相加直到其中一个走完或者全都走完结束*/if(p->data>=1000){p->prior->data=p->prior->data+1;p->data=p->data%1000;}p=p->prior;q=q->prior;}while(p!=NULL) /*当出现进位但是前面却为空时需要申请一个空间然后放进去进的位数*/{if(p->data>=1000){if(p->prior==NULL){q=(LinkList)malloc(sizeof(LNode));q->data=1;p->prior=q;q->next=p;q->prior=NULL;p=NULL;}else{p->prior->data=p->prior->data+1;p->data=p->data%1000;p=p->prior;}}}output(head1,p1);}if(n<m){while(p!=NULL){q->data=q->data+p->data;if(q->data>=1000){q->prior->data=q->prior->data+1;q->data=q->data%1000;}p=p->prior;q=q->prior;}while(q!=NULL){if(q->data>=1000){if(q->prior==NULL){p=(LinkList)malloc(sizeof(LNode));p->data=1;q->prior=q;p->next=p;p->prior=NULL;q=NULL;}else{q->prior->data=q->prior->data+1;计算机人论坛q->data=q->data%1000;q=q->prior;}}}output(head2,p2);}return OK;}Status max_sub(LinkList &head1,LinkList &head2,LinkList &p1,LinkList &p2) /*链表减法*/{LinkList p,q;int n=0,m=0;p=head1;q=head2;while(p!=NULL) /*遍历链表然后记录链表长度*/{n=n+1;p=p->next;}while(q!=NULL) /*遍历链表然后记录链表长度*/{m=m+1;q=q->next;}p=p->prior;q=q->prior;if(n>=m) /*当head1 大于head2时*/{while(q!=NULL){p->data=p->data-q->data; /*两个链表相加直到其中一个走完或者全都走完结束*/if(p->data<0){p->prior->data=p->prior->data-1;p->data=p->data+1000;}p=p->prior;q=q->prior;}output(head1,p1);}if(n<m){while(p!=NULL){q->data=q->data-p->data;if(q->data<0){q->prior->data=q->prior->data-1;q->data=q->data+1000;}p=p->prior;q=q->prior;}output(head2,p2);}return OK;}Status max_mul(LinkList &head1,LinkList &head2,LinkList &p1,LinkList &p2,LinkList &L) /*链表乘法*/{LinkList s;LinkList b,d;LinkList p,q;LinkList h1,h2,tail1,tail2;int n=0,m=0;int i;LinkList r,tail,tailr;ElemType mo,di,re,edi;int c,flag ;p=head1;q=head2;while(p!=NULL) /*遍历链表然后记录链表长度*/{n=n+1;p=p->next;}while(q!=NULL) /*遍历链表然后记录链表长度*/{m=m+1;q=q->next;}h1=(LinkList)malloc(sizeof(LNode)); /*要装拆分第一个双向链表后的链表*/tail1=h1;h1->prior=NULL;i=0;while(i<(3*n)){p=(LinkList)malloc(sizeof(LNode));p=tail1->next;tail1=p->prior;tail1=p;i=i+1;}tail1->next=NULL;h2=(LinkList)malloc(sizeof(LNode)); /*要装拆分第二个双向链表后的链表*/tail2=h2;h2->prior=NULL;i=0;while(i<(3*m)){q=(LinkList)malloc(sizeof(LNode));q=tail2->next;tail2=q->prior;tail2=q;i=i+1;}tail2->next=NULL;s=head1;b=h1->next;while(s!=NULL){b->data=s->data/100; /*拆分head1链表然后放进刚刚建立好的h1双向链表中*/b=b->next;b->data=s->data/10%10;b=b->next;b->data=s->data%10;b=b->next;s=s->next;}s=head2;d=h2->next;while(s!=NULL){d->data=s->data/100; /*拆分head2链表然后放进刚刚建立好的h2双向链表中*/d=d->next;d->data=s->data/10%10;d=d->next;d->data=s->data%10;d=d->next;s=s->next;}/*要做p q 两个链表相乘要考虑进位还有将所得结果放到哪个链表中等问题*/L = (LinkList)malloc(sizeof(LNode)) ; /*用L来装乘完后的数据*/if(!L)exit(OVERFLOW);L->next = NULL;L->prior = NULL;di = 0;edi = 0;tail = p;while(p != NULL){re = p->data * q->data;mo = re % 10;if(L->prior == NULL) {r = L;r->data = mo + di;if (r->data >= 10){edi = r->data / 10;r->data = r->data % 10;}else {edi = 0;}L->prior = L;}else {r = (LinkList)malloc(sizeof(LNode));r->data = mo + di;if (r->data >= 10){edi = r->data / 10;r->data = r->data % 10;}else {edi = 0;}L->prior = r;r->next = L;L = r;}di = edi + re / 10;edi = 0;p = p->prior;}while(di > 0){r = (LinkList)malloc(sizeof(LNode)); r->data = di % 10;di = di / 10;L->prior = r;r->next = L;L = r;L->prior = NULL;}L->prior = NULL;while (r->next != NULL) r = r->next; tailr = r;c=1;q = q->prior;while (q != NULL){p = tail;r = tailr;flag = 0;di = 0;edi = 0;for(i=1;i<=c;i++){if(r->prior != NULL)r = r->prior;else {r = (LinkList)malloc(sizeof(LNode));r->data = 0;L->prior = r;r->next = L;L = r;L->prior = NULL;flag = 1;}}while(p != NULL){re = p->data * q->data;mo = re % 10;if(flag == 0) r->data = r->data+ mo + di;else r->data = mo + di;if (r->data >= 10){edi = r->data / 10;r->data = r->data % 10;}di = edi + re / 10;edi = 0;p = p->prior;if(r->prior != NULL)r = r->prior;else {r = (LinkList)malloc(sizeof(LNode));r->data = 0;L->prior = r;r->next = L;L = r;L->prior = NULL;flag = 1;}}if(di > 0){r->data = di % 10;di = di / 10;}q =q->prior;c++;}return OK;}Status main(){int choose,i;LinkList head1,head2,p1,p2,L;choose=0;while (choose==0){printf("1 输入大整数\n");printf("2 输出大整数\n");printf("3 大整数之和\n");printf("4 大整数之差\n");printf("5 大整数之机\n");printf("6 退出\n");scanf("%d",&choose);switch (choose){case 1:printf("请输入第一个大整数以负数代表结束\n");input(head1);printf("请输入第二个大整数以负数代表结束\n");input(head2);break;case 2:printf("第一个大整数为\n");output(head1,p1);printf("第二个大整数为\n");output(head2,p2);break;case 3:printf("两个大整数相加后结果为\n");max_add(head1,head2,p1,p2);break;case 4:printf("两个大整数相减后结果为\n");max_sub(head1,head2,p1,p2);break;case 5:printf("两个大整数相乘后结果为\n");max_mul(head1,head2,p1,p2,L);break;case 6:choose=1;break;}}return(0);}计算机人论坛。

合集下载

实验03整数的表示实验

实验03整数的表示实验

浙江大学城市学院实验报告课程名称计算机系统原理实验实验项目名称实验三数据的机器级表示实验成绩指导老师(签名)日期一、实验目的:1、通过无符号数和带符号整数之间的相互转换来理解无符号数和补码整数的表示;2、了解IEEE 754浮点数在机器中的应用,特别是一些特殊值的处理。

二、实验步骤:1、用32位补码表示的机器上编译并执行以下程序,记录程序的执行结果,并解释原因。

图3-1运行结果:对运算结果的解释:第一个结果:因为在ISO C90标准中,编译器将-2147483648分为两个部分来处理。

首先将2147483648看成无符号整型,其机器数为0x80000000,然会对其取负,结果仍为0x80000000,还是将其看成无符号整型,其值仍为21474833648,因此前者大于后者。

第二个结果:由于i为int型变量,因此这两个数皆为带符号数,前者小于后者。

第三个结果:编译器首先将2147483647看成带符号整型,然后对其取负,得到-2147483647,然后对其-1得到-2147483648,因此前者大于后者。

2、编写程序,计算表2.1中的表达式,说明运算类型(无符号、带符号),得到运算结果,并说明为什么是这样的运算结果(参考第二章习题8);源代码:运算结果:对运算结果的解释:1.0和0U都是无符号数,值相等2.-1和0都为带符号数,因此前者小于后者3.0后加上U表示无符号数,因此比较时前者大于后者4.-2147483647-1的计算结果为一个int型整数,为带符号数,因此前者大于后者。

5.加上U的数都为无符号数,因此前者小于后者6.2147483648U在经过int强制类型转换后,变为带符号的-2147483648,因此前者大于后者7.两个数皆为带符号数,因此前者大于后者8.数据转化为无符号数,前者11…1B (2^32-1) > 后者11…10B (2^32-2)3、分析以下代码:当len = 0 时, 执行sum 函数的for循环时会发生Access Violation , 即段错误异常. 但是, 当参数len 说明为int 型时, sum 函数能正确执行, 为什么?编写程序测试并分析。

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。

1、求n个元素的全排。

(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。

(30分)3、设有n=2k个运动员要进行网球循环赛。

设计一个满足要求的比赛日程表。

(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。

三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。

c语言实验报告实验

c语言实验报告实验

c语言实验报告实验C 语言实验报告实验一、实验目的本次 C 语言实验的主要目的是通过实际操作和编程实践,加深对 C 语言基本语法、数据类型、控制结构、数组、指针等重要概念的理解和掌握,提高编程能力和解决实际问题的能力。

二、实验环境本次实验使用的编程环境为 Visual Studio 2019,操作系统为Windows 10。

三、实验内容1、基本数据类型和运算符的使用定义不同类型的变量,如整数型(int)、浮点型(float、double)、字符型(char)等,并进行赋值和运算操作。

熟悉各种运算符的优先级和结合性,包括算术运算符(+、、、/、%)、关系运算符(>、<、>=、<=、==、!=)、逻辑运算符(&&、||、!)、位运算符(&、|、^、~、<<、>>)等。

2、控制结构的应用使用ifelse 语句实现条件判断,根据不同的条件执行相应的代码块。

运用 switch 语句进行多分支选择,处理不同的情况。

利用 for 循环、while 循环和 dowhile 循环实现重复执行的操作,例如计算数列的和、打印特定的图案等。

3、数组和字符串的操作定义和使用一维数组、二维数组,进行数组元素的访问、赋值和遍历。

掌握字符串的存储和处理方式,使用字符数组和字符串函数(如strlen、strcpy、strcmp 等)进行字符串的操作。

4、指针的应用理解指针的概念和指针变量的定义,通过指针访问变量和数组元素。

实现指针与数组、指针与函数的结合使用,体会指针在程序中的灵活运用。

5、函数的定义和调用编写自定义函数,实现特定的功能,如计算阶乘、判断素数等。

掌握函数的参数传递方式(值传递和地址传递),理解函数的返回值。

6、结构体和共用体的使用定义结构体类型,创建结构体变量,访问结构体成员。

了解共用体的概念和使用场景,比较结构体和共用体的区别。

四、实验步骤1、实验准备打开 Visual Studio 2019 开发环境,创建一个新的 C 语言项目。

数值计算基础实验报告(3篇)

数值计算基础实验报告(3篇)

第1篇一、实验目的1. 理解数值计算的基本概念和常用算法;2. 掌握Python编程语言进行数值计算的基本操作;3. 熟悉科学计算库NumPy和SciPy的使用;4. 分析算法的数值稳定性和误差分析。

二、实验内容1. 实验环境操作系统:Windows 10编程语言:Python 3.8科学计算库:NumPy 1.19.2,SciPy 1.5.02. 实验步骤(1)Python编程基础1)变量与数据类型2)运算符与表达式3)控制流4)函数与模块(2)NumPy库1)数组的创建与操作2)数组运算3)矩阵运算(3)SciPy库1)求解线性方程组2)插值与拟合3)数值积分(4)误差分析1)舍入误差2)截断误差3)数值稳定性三、实验结果与分析1. 实验一:Python编程基础(1)变量与数据类型通过实验,掌握了Python中变量与数据类型的定义方法,包括整数、浮点数、字符串、列表、元组、字典和集合等。

(2)运算符与表达式实验验证了Python中的算术运算、关系运算、逻辑运算等运算符,并学习了如何使用表达式进行计算。

(3)控制流实验学习了if-else、for、while等控制流语句,掌握了条件判断、循环控制等编程技巧。

(4)函数与模块实验介绍了Python中函数的定义、调用、参数传递和返回值,并学习了如何使用模块进行代码复用。

2. 实验二:NumPy库(1)数组的创建与操作通过实验,掌握了NumPy数组的基本操作,包括创建数组、索引、切片、排序等。

(2)数组运算实验验证了NumPy数组在数学运算方面的优势,包括加、减、乘、除、幂运算等。

(3)矩阵运算实验学习了NumPy中矩阵的创建、操作和运算,包括矩阵乘法、求逆、行列式等。

3. 实验三:SciPy库(1)求解线性方程组实验使用了SciPy库中的线性代数模块,通过高斯消元法、LU分解等方法求解线性方程组。

(2)插值与拟合实验使用了SciPy库中的插值和拟合模块,实现了对数据的插值和拟合,并分析了拟合效果。

长整数四则运算 实验报告

长整数四则运算 实验报告

“数据结构”课程设计报告长整数四则运算学生姓名:吴成杰徐文良指导教师:陈少军所在系:电子信息系所学专业:计算机科学与技术年级:2010计算机(1)班目录第1章需求分析 (1)1.1选题要求 (1)1.2选题背景和意义 (1)1.3选题目标 (2)1.4组员分配任务 (2)第2章概要分析 (2)2.1系统数据流图 (2)2.2原始数据 (3)2.3输出数据 (3)2.4对数据的处理 (3)2.5数据结构(存储方式) (4)2.6模块分析 (4)第3章详细设计 (4)第4章系统说明书 (11)第5章系统测试 (12)项目总结 (16)参考文献 (17)第1章需求分析1.1选题要求1、实现一个任意长度的整数进行四则运算的演示程序(1) 运算过程分步骤显示(2) 完成含有加法和减法的四则运算(3) 完成含有乘法和除法的四则运算(4) 包含括号的四则运算2、2个人对应完成2个人各自的任务1.2选题背景和意义(1)选题背景操作系统老师曾经布置我们做一道斐波拉契数列和求30的阶乘,但是计算的结果很大,还不知道该做样的存储,老师告诉我们需要用高精度数的知识能将计算的结果存储起来,数据结构老师也曾经布置过一个实验题,是计算长整数的加法的,但是长整数的位数是固定的。

于是我们试想计算任意长度的整数是不是能把所有的四则运算问题解决。

(2)选题意义我们选的这个课题能计算任意的四则运算,比如:1234567+7654321=8888888987654321-123456789=86419754123*456=5608884/42=2586-25*15+8*(9*2-144/12)=586-375+8*(18-12)=586-375+8*6=586-355+48=211+48=2591.3选题目标实现一个任意长度的整数进行四则运算的演示程序(1) 运算过程分步骤显示(2) 完成含有加法和减法的四则运算(3) 完成含有乘法和除法的四则运算(4) 包含括号的四则运算1.4组员分配任务我们组有两个成员,分别为吴成杰和徐文良,一个负责写主函数、函数整体的框架和写转换函数函数和对输入的字符进行处理,一个负责写出栈函数和写处理函数和拼接,程序出现错误,两个人一起在一起互相商量,修改。

算法与分析实验报告

算法与分析实验报告

算法与分析实验报告一、引言算法是现代计算机科学中的核心概念,通过合理设计的算法可以解决复杂的问题,并提高计算机程序的执行效率。

本次实验旨在通过实际操作和数据统计,对比分析不同算法的执行效率,探究不同算法对于解决特定问题的适用性和优劣之处。

二、实验内容本次实验涉及两个经典的算法问题:排序和搜索。

具体实验内容如下:1. 排序算法- 冒泡排序- 插入排序- 快速排序2. 搜索算法- 顺序搜索- 二分搜索为了对比不同算法的执行效率,我们需要设计合适的测试用例并记录程序执行时间进行比较。

实验中,我们将使用随机生成的整数数组作为排序和搜索的测试数据,并统计执行时间。

三、实验步骤1. 算法实现与优化- 实现冒泡排序、插入排序和快速排序算法,并对算法进行优化,提高执行效率。

- 实现顺序搜索和二分搜索算法。

2. 数据生成- 设计随机整数数组生成函数,生成不同大小的测试数据。

3. 实验设计- 设计实验方案,包括测试数据的规模、重复次数等。

4. 实验执行与数据收集- 使用不同算法对随机整数数组进行排序和搜索操作,记录执行时间。

- 多次重复同样的操作,取平均值以减小误差。

5. 数据分析与结果展示- 将实验收集到的数据进行分析,并展示在数据表格或图表中。

四、实验结果根据实验数据的收集与分析,我们得到以下结果:1. 排序算法的比较- 冒泡排序:平均执行时间较长,不适用于大规模数据排序。

- 插入排序:执行效率一般,在中等规模数据排序中表现良好。

- 快速排序:执行效率最高,适用于大规模数据排序。

2. 搜索算法的比较- 顺序搜索:执行时间与数据规模成线性关系,适用于小规模数据搜索。

- 二分搜索:执行时间与数据规模呈对数关系,适用于大规模有序数据搜索。

实验结果表明,不同算法适用于不同规模和类型的问题。

正确选择和使用算法可以显著提高程序的执行效率和性能。

五、实验总结通过本次实验,我们深入了解了不同算法的原理和特点,并通过实际操作和数据分析对算法进行了比较和评估。

割平面法求解整数规划问题实验报告

运筹学与最优化MATLAB 编程实验报告割平面法求解整数规划问题一、 引言:通过对MATLAB 实践设计的学习,学会使用MATLAB 解决现实生活中的问题。

该设计是在MATLAB 程序设计语言的基础上,对实际问题建立数学模型并设计程序,使用割平面法解决一个整数规划问题。

经实验,该算法可成功运行并求解出最优整数解。

二、 算法说明:割平面法有许多种类型,本次设计的原理是依据Gomory 的割平面法。

Gomory 割平面法首先求解非整数约束的线性规划,再选择一个不是整数的基变量,定义新的约束,增加到原来的约束中,新的约束缩小了可行域,但是保留了原问题的全部整数可行解。

算法具体设计步骤如下:1、首先,求解原整数规划对应的线性规划,*)(min x c x f =⎩⎨⎧≥≤0..x bAx t s ,设最优解为x*。

2、如果最优解的分量均为整数,则x*为原整数规划的最优解;否则任选一个x*中不为整数的分量,设其对应的基变量为x p ,定义包含这个基变量的切割约束方程con jj ij p b x r x =+∑,其中x p 为非基变量。

3、令][ij ij ij r r r -=,][con con con b b b -=,其中[]为高斯函数符号,表示不大于某数的最大整数。

将切割约束方程变换为∑∑-=-+jjij con con jj ij p x r b b x r x ][][,由于0<ij r <1,0<con b <1,所以有1<-∑jj ij con x r b ,因为自变量为整数,则∑-jj ij con x r b 也为整数,所以进一步有0≤-∑jj ij con x r b 。

4、将切割方程加入约束方程中,用对偶单纯形法求解线性规划⎪⎪⎩⎪⎪⎨⎧≥≤-≤=∑00..,*)(min x x r b b Ax t s x c x f j j ij con ,然后在转入步骤2进行求解,直到求出最优整数解停止迭代。

分治法实验报告

算法实验报告一分治法实验一、实验目的及要求利用分治方法设计大整数乘法的递归算法,掌握分治法的基本思想和算法设计的基本步骤。

要求:设计十进制的大整数乘法,必须利用分治的思想编写算法,利用c语言(或者c++语言)实现算法,给出程序的正确运行结果。

(必须完成)设计二进制的大整数乘法,要求利用分治的思想编写递归算法,并可以实现多位数的乘法(利用数组实现),给出程序的正确运行结果。

(任选)二、算法描述1、输入两个相同位数的大整数u,v 输出uv的值判断大整数的位数i;w=u/10^(i/2);y=v/10^(i/2);x=u-w*10^(i/2);z= v-y*10^(i/2);然后将w,x,y,z代入公式求得最后结果uv=wy10^i+((w+x)(y+z)-wy-xz)10^(i/2)+xz三、调试过程及运行结果在实验中我遇到的问题:原来以为这两个大整数的位数不同,结果题目要求是相同位数的大整数在写10的多少次方时,写的是10^(i/2),10^(i),结果不对,我就将它改成了for循环语句四、实验总结在本次实验中,我知道了分治算法,以及分治算法的基本思想。

我还掌握了编写大整数乘法的算法与步骤,以及如何修改在编写程序时遇到的问题。

五、附录(源程序代码清单)1、#include&lt;iostream.h&gt; int weishu(int x){int i;while(x!=0){ x=x/10;i++;}return i;}void main(){int u,v;cout&lt;&lt;输入两个位数相同的大整数:&lt;&lt;endl; cin&gt;&gt;u;cin&gt;&gt;v;int i,j,m,n;int p,x,y,z,w;int a=1;int b=1;i=weishu(u);for(int k=1;k&lt;=i;k++){a=a*10;}for(int q=1;q&lt;=i/2;q++) {b=b*10;}w=u/b;y=v/b;x=u-w*b;z=v-y*b;p=w*y*a+((w+x)*(y+z)-w*y-x*z)*b+x*z; cout&lt;&lt;u&lt;&lt;*&lt;&lt;v&lt;&lt;=&lt;&lt;p; }教师评语:成绩:√优良中及格不及格算法实验报告二动态规划法实验一、实验目的及要求利用动态规划方法设计背包问题算法,掌握动态规划法的基本思想和算法设计的基本步骤。

关于算法的实验报告(3篇)

第1篇一、实验目的1. 理解快速排序算法的基本原理和实现方法。

2. 掌握快速排序算法的时间复杂度和空间复杂度分析。

3. 通过实验验证快速排序算法的效率。

4. 提高编程能力和算法设计能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验原理快速排序算法是一种分而治之的排序算法,其基本思想是:选取一个基准元素,将待排序序列分为两个子序列,其中一个子序列的所有元素均小于基准元素,另一个子序列的所有元素均大于基准元素,然后递归地对这两个子序列进行快速排序。

快速排序算法的时间复杂度主要取决于基准元素的选取和划分过程。

在平均情况下,快速排序的时间复杂度为O(nlogn),但在最坏情况下,时间复杂度会退化到O(n^2)。

四、实验内容1. 快速排序算法的代码实现2. 快速排序算法的时间复杂度分析3. 快速排序算法的效率验证五、实验步骤1. 设计快速排序算法的C++代码实现,包括以下功能:- 选取基准元素- 划分序列- 递归排序2. 编写主函数,用于生成随机数组和测试快速排序算法。

3. 分析快速排序算法的时间复杂度。

4. 对不同规模的数据集进行测试,验证快速排序算法的效率。

六、实验结果与分析1. 快速排序算法的代码实现```cppinclude <iostream>include <vector>include <cstdlib>include <ctime>using namespace std;// 生成随机数组void generateRandomArray(vector<int>& arr, int n) {srand((unsigned)time(0));for (int i = 0; i < n; ++i) {arr.push_back(rand() % 1000);}}// 快速排序void quickSort(vector<int>& arr, int left, int right) { if (left >= right) {return;}int i = left;int j = right;int pivot = arr[(left + right) / 2]; // 选取中间元素作为基准 while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j);quickSort(arr, i, right);}int main() {int n = 10000; // 测试数据规模vector<int> arr;generateRandomArray(arr, n);clock_t start = clock();quickSort(arr, 0, n - 1);clock_t end = clock();cout << "排序用时:" << double(end - start) / CLOCKS_PER_SEC << "秒" << endl;return 0;}```2. 快速排序算法的时间复杂度分析根据实验结果,快速排序算法在平均情况下的时间复杂度为O(nlogn),在最坏情况下的时间复杂度为O(n^2)。

算法设计与分析实验报告

算法设计与分析报告学生姓名学号专业班级指导教师完成时间目录一、课程内容 (3)二、算法分析 (3)1、分治法 (3)(1)分治法核心思想 (3)(2)MaxMin算法分析 (3)2、动态规划 (4)(1)动态规划核心思想 (4)(2)矩阵连乘算法分析 (5)3、贪心法 (5)(1)贪心法核心思想 (5)(2)背包问题算法分析 (6)(3)装载问题算法分析 (7)4、回溯法 (7)(1)回溯法核心思想 (7)(2)N皇后问题非递归算法分析 (7)(3)N皇后问题递归算法分析 (8)三、例子说明 (9)1、MaxMin问题 (9)2、矩阵连乘 (10)3、背包问题 (10)4、最优装载 (10)5、N皇后问题(非递归) (11)6、N皇后问题(递归) (11)四、心得体会 (12)五、算法对应的例子代码 (12)1、求最大值最小值 (12)2、矩阵连乘问题 (13)3、背包问题 (15)4、装载问题 (17)5、N皇后问题(非递归) (19)6、N皇后问题(递归) (20)一、课程内容1、分治法,求最大值最小值,maxmin算法;2、动态规划,矩阵连乘,求最少连乘次数;3、贪心法,1)背包问题,2)装载问题;4、回溯法,N皇后问题的循环结构算法和递归结构算法。

二、算法分析1、分治法(1)分治法核心思想当要求解一个输入规模为n,且n的取值相当大的问题时,直接求解往往是非常困难的。

如果问题可以将n个输入分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1<k≤n, 而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。

那末,这类问题可以用分治法求解。

分治法的核心技术1)子问题的划分技术.2)递归技术。

反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出不用进一步细分就可求解的子问题。

3)合并技术.(2)MaxMin算法分析问题:在含有n个不同元素的集合中同时找出它的最大和最小元素。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档