分治法实验报告
算法实验报告一分治法实验
一、实验目的及要求
利用分治方法设计大整数乘法的递归算法,掌握分治法的基本思想和算法设计的基本步
骤。
要求:设计十进制的大整数乘法,必须利用分治的思想编写算法,利用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<iostream.h> int weishu(int x)
{
int i;
while(x!=0)
{ x=x/10;
i++;
}
return i;
}
void main()
{
int u,v;
cout<<输入两个位数相同的大整数:<<endl; cin>>u;
cin>>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<=i;k++)
{
a=a*10;
}
for(int q=1;q<=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<<u<<*<<v<<=<<p; }
教师评语:
成绩:√优良中及格不及格
算法实验报告二动态规划法实验
一、实验目的及要求
利用动态规划方法设计背包问题算法,掌握动态规划法的基本思想和算法设计的基本步
骤。
要求:设计0/1背包问题的动态规划算法,要求输出背包内物品的最大价值以及选入背
包的物品种类。利用c语言(c++语言)实现算法,给出程序的正确运行结果。
二、算法描述
输入:各物品的体积、价值,背包容量
输出:放入背包的物品的体积,放入物品的最大价值
for i<-0 to n
v[i,0]<-0
end for
for j<-0 to c
v[j,0]<-0
end for
for i<-1 to n
for j<-1 to c
v[i,j]<-v[i-1,j]
if(si<=j and v[i-1,j-si]+vi)>v[i,j] ) v[i,j]<-v[i-1,j-si]+vi
item[j]=i
end for
end for
for i<-c downto 1 (i=i-item[i]的体积) printf(s[item[i]])
end for
return v[n,c]
三、调试过程及运行结果
在定义数组时数组的大小不能是变量,也不能定义一个变量从键盘输入一个常数,再用
这个变量定义数组,只能直接用常量定义数组或者用宏定义的量来定义数组。
在进行多个for循环时,不管他们之间有没有关系,循环中定义的变量不能一样。
在定义数组v[][]时,数组大小必须是n+1、c+1。
四、实验总结
在进行本次实验时,我知道了背包程序的算法以及它的基本的意思,算法想要做什么。
我还掌握了一些在学c++时没有注意到的一些小问题。如在定义数组时数组的大小不能是变
量,也不能定义一个变量从键盘输入一个常数,再用这个变量定义数组,只能直接用常量定
义数组或者用宏定义的量来定义数组。在进行多个for循环时,不管他们之间有没有关系,
循环中定义的变量不能一样。在定义数组v[][]时,数组大小必须是n+1、c+1。
五、附录(源程序代码清单)
#include<iostream.h> #define n 10
#define c 12
void main()
{
int s[n],v[n];
int v[n+1][c+1];
int item[c];
cout<<物品的体积:<<endl; for(int f=0;f<n;f++)
cin>>s[f]; cout<<物品的价值:<<endl; for(int h=0;h<n;h++)
cin>>v[h];
for(int k=0;k<=n;k++)
{
v[k][0]=0;
}
for(int m=0;m<=c;m++)
{
v[0][m]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=c;j++)
{
v[i][j]=v[i-1][j];
if(s[i]<=j && v[i-1][j-s[i]]+v[i]>v[i][j]) { v[i][j]=v[i-1][j-s[i]]+v[i]; item[j]=i; }
}
} cout<<放入背包的物品的体积:<<endl; for(int
p=c;p>=1;p=p-s[item[p]])
{
cout<<s[item[p]];
cout<<endl;
}
cout<<背包的最大价值:; cout<<v[n][c]<<endl; }
教师评语:
成绩:√优良中
及格不及格篇二:分治算法实验报告
本科学生综合性实验报告
姓名___刘春云学号_ 0103918__
_
专业__软件工程__班级_ 103__
实验项目名称_二分搜索问题的分治算法实验指导教师及职称_____赵晓平__
___开课学期 2011 至_ 2012 学年_ 3 _学期
上课时间 2012 年 2 月 18 日
学生实验报告(1)
一、问题描述
二分查找又称折半查找,即在一串已排好序的需要处理的数据中多次用折半的方法查找
出要搜索出的数据。
二、解题思路
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如
果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置
记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以
上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
三、算法描述
用一个数组来存储数据,具体的结构体为: typedef struct list { double elem[100]; int length; }list;其中length是数据的总个数
比较表中间位置记录的关键字与查找关键字的大小,逐步缩小查找范围实现代码为:
while(low<high)
{ mid=(low+high)/2; if(l.elem[mid]==key) { } else if(l.elem[mid]<key) low=mid;
outfile<<你所要搜索的数据在第<<mid+1<<个位置<<endl;
break;
else
high=mid;
if(high==low+1) {
outfile<<抱歉!你所要搜索的数据不在你所输入的数据中break; <<endl;
范围
}
}在上段代码中low表示搜索区间的最小范围,hiah则表示搜索区间的最大
在代码中出现的int init_list(list&l)是一个初始函数用于从input.txt文件中
读入
数据并判断数据是否升序排列。int search(int low,int high,list&l)是查找函数
用于折半查找。
四、算法实现
#include <iostream> #include<fstream> using namespace std; typedef
struct list {
double elem[100]; int length; }list; int init_list(list&l)//初始化函数 { } int search(int low,int high,list&l)//查找函数 { int search(int low,int high,list&l); int n=0; ifstream infile; cout<<请输入数据(必须是从小到大排序的)<<endl;
infile.open(input.txt,ios::in); ofstream outfile; outfile.open(output.txt,ios::app); while(infile>>l.elem[n])//从文件中输入已排序数组,直到文件中无数据读取
n++; infile.close(); l.length=n; for(int i=0;i<l.length-1;i++)//判断输入的数据是否有序 { if(l.elem[i]>l.elem[i+1]) { } outfile<<朋友请不要玩我!<<endl; return 0; }//判断输入的数据是否有序
cout<<二分查找中......<<endl; search(0,l.length-1,l); return 1;
ofstream outfile;
outfile.open(output.txt,ios::app); int mid=0;//中点篇三:分治法实验报告
石家庄经济学院
《算法设计与分析》实验报告
姓名:
班级:
学号:
指导教师:
完成日期:
一、实验名称
分治法实验
二、实验目的
1. 掌握分治法的基本思想、求解问题的基本步骤;
2. 掌握分支算法的一般模式;
3. 根据问题采取有效的分解和合并的方式,能够分析确定问题的阈值;
4. 掌握分治算法的时间复杂度,并能利用c语言实现算法。
三、实验内容及要求
1. 大整数乘法。
要求:
(1) 求解两个n位的二进制整数的乘法,设n=2k;
(2) 利用分治的思想分析和求解问题;
(3) 利用c语言实现算法,要求结果正确。
2. 矩阵相乘(选做)
(1) 求解两个n阶方阵的乘法,设n=2k;
(2) 可利用基本的分解方法或者stranssen方法求解;
(3) 利用c语言实现算法,要求结果正确。
四、问题分析及算法设计
1. 大整数乘法
问题分析:
算法设计:
算法复杂度分析:
2. 矩阵乘法
问题分析:
算法设计:
算法复杂度分析:
五、代码及运行结果
六、实验总结
(要求总结本次实验遇到的问题及解决方法,收获和不足,300字以上,提交报告时删
去此行)
教师评语:
成绩:优良中及格不及格篇四:算法-实验报告-分治法
年级 2012 学院专业班级学生姓名学号
《算法分析与设计》实验报告(1) 篇五:算法实验四分治法实验报告
算法实验四分治法实验
实验一最近点对
最近点对问题描述:对平面上给定的n个点,给出所有点对的最短距离即,输入是平面
上的n个点,输出是n点中具有最短距离的两点要求随机生成n个点的平面坐标,应用穷举
法编程计算出所有点对的最短距离要求随机生成n个点的平面坐标,应用分治法编程计算出
所有点对的最短距离。
二、实验数据及分析
平面点数为100:
平面点数为 500 平面点数为1000:
可以看出,分治法的运行效率要明显比直接法要高。
三轮DES差分分析实验报告-刘杰
DES 差分分析实验报告 四大队四队五班 刘杰 一、实验目的 差分密码分析是一种选择明文攻击,是现代分组密码分析的重要方法之一,也是理论分析密码算法和算法抗攻击测试的重要依据之一。本实验通过3轮DES 简化算法的差分分析来达到加深学员对差分分析方法原理的理解和利用该原理分析实际问题的操作能力。 二、实验内容 (1)3轮DES 简化算法的差分分析; (2)通过三组明密文对(每组两个相关明文和相应密文),利用差分原理提取密钥。 明 文 密 文 748502CD38451097 03C70306D8A09F10 3874756438451097 78560A0960E6D4CB 486911026ACDFF31 45FA285BE5ADC730 375BD31F6ACDFF31 134F7915AC253457 357418DA013FEC86 D8A31B2F28BBC5CF 12549847013FEC86 0F317AC2B23CB944 三、实验原理 设DES 两个明密文对:=00m L R ***=00m L R =33c L R *** =33c L R 计算过程: (,)(,)(,)(,)=⊕=⊕=⊕⊕322312300123R L f R k R f R k L f R k f R k
(,)(,)****=⊕⊕300123R L f R k f R k 令:*'=⊕000L L L (,)(,)(,)(* **''=⊕=⊕⊕⊕⊕333001012323R R R L f R k f R k f R k f R k 观察得:在本次实验原始数据中,明文对*=00R R ,即* '=⊕=00000000000R R R 则(,)(,)** ''=⊕=⊕⊕33302323R R R L f R k f R k 同时有:=00m L R ***=00m L R =23R L ** =23R L 则可计算出:*'=⊕000L L L *'=⊕333R R R (,)(,)* ''⊕=⊕232330f R k f R k R L 则可得出: S 盒输入差:(())(())()()* *⊕⊕⊕=⊕232333E R k E R k E L E L S 盒输出差:()*-''⊕=⊕13 0D D P R L 分析过程: 令:()()*⊕=3312345678E L E L B B B B B B B B ()-''⊕=13 012345678P R L C C C C C C C C ()=312345678E L A A A A A A A A =312345678 k J J J J J J J J ()⊕=3312345678E L k X X X X X X X X *()⊕=3312345678E L k Y Y Y Y Y Y Y Y 基本思路:(分别计算12345678J J J J J J J J ) {|,()()∈=⊕⊕=⊕=i i i i i i i J T e s t x A x y B S x S y C ,,,,,,,=12345678i 对于本次实验的3个具有明文差(*,0)的明密文对,则可构造上面的3个 Test 集合,显然 ()()( )∈12 i i i i J Test Test Test t ,,,,,,,=12345678i 一种确定Ji 的直接方法: 1.建立26=64长度的数组J[64]={0}; 2.对Testi(r),r = 1,2,…,t ,若a ∈Testi(r),则 J[a] = J[a] + 1。 3.若J[b] =3,则6比特串b 就是可能的密钥比特 Ji 。 四、实验环境 Microsoft visual c++ 五、实验步骤 (1)计算简化算法第3轮S 盒输入差
Poisson方程九点差分格式_米瑞琪
数值实验报告I 实验名称Poisson方程九点差分格式实验时间2016年 4 月 15 日姓名米瑞琪班级信息1303学号04成绩 一、实验目的,内容 1、理解Poisson方程九点差分格式的构造原理; 2、理解因为网格点的不同排序方式造成的系数矩阵格式的差异; 3、学会利用matlab的spdiags(),kron()函数生成系数矩阵; 二、算法描述 针对一个Poisson方程问题: 在Poisson方程五点差分格式的基础上,采用Taylor展开分析五点差分算子的截断误差,可以得到: 为了提高算子截断误差的精度,在(1)式中配凑出了差分算子的形式,将原Poisson方程代入(1)式有: 考虑,有:
将(3)代回(2)可得 得到Poisson方程的九点差分格式: 在计算机上实现(4)式,需要在五点差分格式 的基础上在等式两端分别增加一部分,将等式左侧新增的部分写成紧凑格式,有: 对于该矩阵,可以看成是两个矩阵的组合:
以及 则生成这两个矩阵可以采用Kroncker生成,方法类似于五点差分格式。 对于右端添加的关于f(x,y)的二阶导数,可以采用中心差分格式进行近似代替,即: 写成相应的紧凑格式有:
该式中的矩阵又可以分解为两个矩阵的和:
%计算误差 u_real=@(x,y)exp(pi*(x+y))*sin(pi*x).*sin(pi*y); for i=1:N1-1 u_m((i-1)*(N2-1)+1:i*(N2-1))=u_real(x(i),y); end u_v=u_m'; err_d=max(abs(u_d-u_v)); sol=reshape(u_d,N2-1,N1-1); mesh(X,Y,sol) 四. 数值结果 针对课本P93给出的问题,分别采用步长,将计算出的误差列表如下: 步长五点差分格式误差九点差分格式误差 可见采用九点差分格式可以进一步缩小误差,达到更高阶的精度。 五. 计算中出现的问题,解决方法及体会 在生成九点差分格式的时候,等号右端涉及到了对f的二阶偏导,我最初利用符号函数定义了f,随后求出其二阶偏导(仍然是符号函数)之后带入网格点,求f二阶偏导的精确解,但是代入过程相当繁琐,运行速度非常慢,最终我改变策略,选用f关于x,y的二阶中心差分格式替代精确值,最终得到了相对满意的结果。 教 师 评 语 指导教师:年月日
有限差分法实验报告
工程电磁场 实验报告 ——有限差分法
用超松弛迭代法求解 接地金属槽内电位的分布 一、实验要求 按对称场差分格式求解电位的分布 已知: 给定边值:如图1-7示 图1-7接地金属槽内半场域的网格 给定初值)()(.1j 40 100 1j p 1 2j i -= --= ??? 误范围差: 510-=ε 计算:迭代次数N ,j i ,?,将计算结果保存到文件中 二、实验思想 有限差分法 有限差分法(Finite Differential Method )是基于差分原理的一种数值计算法。其基本思想:将场域离散为许多小网格,应用差分原理,将求解连续函数?的泊松方程的问题转换为求解网格节点上? =?= V 100 ? 0 =?0 =?
的差分方程组的问题。 泊松方程的五点差分格式 )(4 1 4243210204321Fh Fh -+++=?=-+++?????????? 当场域中,0=ρ得到拉普拉斯方程的五点差分格式 )(4 1 044321004321??????????+++=?=-+++ 差分方程组的求解方法(1) 高斯——赛德尔迭代法 ][)(,)(,)(,)(,)(,2 k 1j i k j 1i 1k 1j i 1k j 1i 1k j i Fh 4 1 -+++=+++-+-+????? (1-14) 式中:??????=??????=,2,1,0,2,1,k j i , ? 迭代顺序可按先行后列,或先列后行进行。 ? 迭代过程遇到边界节点时,代入边界值或边界差分 格式,直到所有节点电位满足ε??<-+)(,)(,k j i l k j i 为止。 (2)超松弛迭代法 ][) (,)(,)(,)(,)(,)(,)(,k j i 2k 1j i k j 1i 1k 1j i 1k j 1i k j i 1k j i 4Fh 4 ?????α??--++++=+++-+-+ (1-15) 式中:α——加速收敛因子)21(<<α 可见:迭代收敛的速度与α有明显关系 三、程序源代码 #include