信息安全算法设计实验报告_第1页
信息安全算法设计实验报告_第2页
信息安全算法设计实验报告_第3页
信息安全算法设计实验报告_第4页
信息安全算法设计实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE15-实验总成绩:实验总成绩:——————————————————————————装订线—————————————————————————————————报告份数报告份数:信息安全算法设计实验报告专业班级:学生姓名:学号(班内序号):年月日【实验内容】根据题目的要求,编程实现相关信息安全的基本算法,编程语言不限。【实验时间和地点安排】时间:课内上机时间地点:信息安全实验室指导老师:XX【实验题目及要求】(一)DNA序列1.输出附件DNA.txt文件中每种DNA碱基三联体的个数。从AAA到TTT,一共64种三联体。2.算法代码:

#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){ intA[4][4][4]={0}; intd[3]; charr[4]={'A','C','G','T'}; intindex; inti,j,k,m; FILE*fp; doublestart,finish; charch; intisLEGAL[256];//对可能出现的ASCII符号判断并求值,一身二任 start=clock(); for(i=0;i<256;i++) isLEGAL[i]=-1; //以下是合法值映射,非法值映射到-1上 isLEGAL['A']=0; isLEGAL['C']=1; isLEGAL['G']=2; isLEGAL['T']=3; fp=fopen("DNA.txt","r"); m=0; ch=fgetc(fp); while(ch!=EOF) { index=isLEGAL[ch]; if(index>-1) { d[m]=index; ++m; } if(m==3) { ++A[d[0]][d[1]][d[2]]; m=0; } ch=fgetc(fp); } for(i=0;i<4;++i) for(j=0;j<4;++j) for(k=0;k<4;++k) printf("%c%c%c:%d\t",r[i],r[j],r[k],A[i][j][k]); fclose(fp); printf("\n"); finish=clock(); printf("时间:%.3fms",finish-start); return0;}3.实验结果:4.实验心得:通过这次实验,我体会到做完测试实验并非不容易成功,遍历算法对实验的影响,处理文件的速度不一样。我曾经用ifelseif和switch来用来判断,发现ifelse竟然比switch运行的时间快。所以在判断ifelse-if和switch的运行速度的时候不能单纯说谁快谁慢。随后听老师用以上的的映射后,其中判断的跳转很简单。这种映射的方法能很快速的解决多路分支的问题。(二)二维求和问题

1.设已定义某int型二维向量a,且对其任意元素a[i][j]赋值为i*j+j+1,则求部分和s[i][j]=。2.实验代码#include<iostream>#include<vector>#include<iomanip>usingnamespacestd;usingstd::vector;voidperfixsum(constvector<vector<int>>&A,vector<vector<int>>&S,constintu,constintv){ inti; S=A; for(i=0;i<u;i++) for(intj=1;j<v;j++) S[i][j]+=S[i][j-1]; for(i=1;i<u;i++) for(intj=0;j<v;j++) S[i][j]+=S[i-1][j];}voidmain(){ intu,v,sum=1; cout<<"请输入矩阵的行列"<<endl; cin>>u>>v; vector<vector<int>>a(u); vector<vector<int>>s(u); for(size_ti=0;i<u;i++) { a[i].resize(v); for(size_tj=0;j<v;j++) a[i][j]=sum++; } perfixsum(a,s,u,v); for(i=0;i<u;i++) { for(size_tj=0;j<v;j++) cout<<setw(5)<<s[i][j]; cout<<endl; }}3.实验结果4.实验心得通过这次实验,我个人得到不少收获,培养综合应用相关知识来解决测试问题的基础理论,培养在实践中研究问题,分析问题和解决问题的能力。因为做的是2维的,只是在一维求和的基础上,把n行的数加上n-1行的数,就得到了,第n行的数据。(三)随机行走1.我们面对一个有许多小瓷砖拼起来的三角形区域,每块是边长为一的等边三角形,K只小虫在此区域内随机行走,小虫可以停留在原来的区域内,也可以走到与原来相邻的三个区域内,即共有四种选择。每次模拟过程中,小虫需要多少步才能把整个区域走完,若能走遍,输出每只小虫到小瓷砖的次数,若不能走遍,说出理由。2.实验代码#include<vector>#include<ctime>#include<iostream>#include<iomanip>usingstd::vector;usingnamespace::std;main(){ inti,j,n,flag=1,p,q; intdata; cout<<"请输入阶数"<<endl; cin>>n; vector<vector<int>>mat(n);//2维向量 for(i=0;i<n;i++) { mat[i].resize(2*i+1); for(j=0;j<2*i+1;j++) mat[i][j]=0; } mat[0][0]=1; i=0;j=0; srand((unsigned)time(NULL));//随机数 while(flag) { data=rand()%4; switch(data) { case0:mat[i][j]++;break;//在原地 case1:{ j--;//左移 if(j<0)//发生越界回到原来的地方 {j++;} mat[i][j]++;break; } case2:{ j++;//右移 if(j>2*i)j--; mat[i][j]++;break; } case3: { if(!(j%2))//j为偶数是上三角形,下移 {i++,j++; if(i>=n) {i--;j--;} } else { i--,j--; if(i<0) {i++;j++;} } mat[i][j]++; } } flag=0; for(p=0;p<n;p++) { for(q=0;q<2*p+1;q++) if(mat[p][q]==0) {flag=1;p=n;q=2*p;} } } for(i=0;i<n;i++) { for(j=0;j<2*i+1;j++) cout<<setw(4)<<mat[i][j]; cout<<endl; }}3.实验结果4.实验心得在做实验前,一定要将课本上的知识吃透,因为这是做好实验的基础,否则就会使实验难度加大,浪费做实验的时间。这次没有考虑算法的时间。这种用时间的为种子的随机数是真正的随机数,在实验中的跳转,没有想到好的映射的方法,所以选用了switch。实验中,小虫碰壁时也就是小虫移动位置在向量外,视为没有移动。最主要是要写出每个数字所对应的下边移动的方向。向量也比用数组方便,和节约资源。(四)幻方

1.所谓幻方,就是一个n行n列的正方形,共有n2个格子,将1、2、3、……、n2这些数字放到这些格子里,使其每行的和、每列的和及两条对角线的和都是一个相同的数S,S称为幻和。找到所有的符合条件的幻方。2.实验代码#include<iostream>#include<vector>#include<ctime>#include<iomanip>usingstd::vector;usingnamespace::std;intn;voidpermute(vector<int>&a,intk){ size_ti;//计数变量 intswapTemp;//交换首元素暂时存变量 intconstsum=n*(1+n*n)/2; intsum1=0; if(k==a.size()) //到终止条件,则在屏幕上输出某一个排列 { for(i=0;i<n;i++)//斜向 {sum1+=a[i*n+i];} if(sum!=sum1) return; for(i=0;i<a.size();i++) { cout<<setw(3)<<a[i]; if((i+1)%n==0) cout<<endl; } cout<<endl; } else//未到终止条件,用轮换首元素的方式继续递归 for(i=k;i<a.size();i++) { //先把首元素a[k]与后面的元素交换 swapTemp=a[k]; a[k]=a[i]; a[i]=swapTemp; if((k+1)%n==0)//横向 { for(inti=0;i<n;i++) sum1+=a[k-i]; if(sum!=sum1) {sum1=0;gotoloop;} sum1=0; } if(k>=n*(n-1))//纵向 { intm=k-n*(n-1); for(inti=0;i<n;i++) sum1+=a[k-i*n]; if(sum!=sum1) {sum1=0;gotoloop;} sum1=0; } if(k==n*(n-1))//对角线 {for(inti=0;i<n;i++) sum1+=a[(i+1)*(n-1)]; if(sum!=sum1) {sum1=0;gotoloop;} sum1=0; } //用递归产生此情况下的排列 permute(a,k+1); //再把首元素换回来以进行下次交换loop: swapTemp=a[k]; a[k]=a[i]; a[i]=swapTemp; }}intmain(){ clock_tstart,finish; doubleduration; cout<<"请输入阶数"<<endl; cin>>n; vector<int>data(n*n); for(size_ti=0;i<data.size();i++) data[i]=i+1; start=clock(); permute(data,0); finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; printf("%fseconds\n",duration); return0;}3.实验结果4阶耗时太长,没有给出结果4.实验心得及思路在实验过程中我受益匪浅,运用permute来实现对n*n个元素的全排列,在选择的时候采用的是排列好n个元素时,判断这一行的元素和是否是幻和。如果不是就跳过下面所有以这n个元素为头的排列。在一列排好后也是同样的验证方法。有个特殊的点就是负对角线,我也加了一个判断。程序中不足的地方就是,前两种判断最多有一种会执行,最后一个在一个排列中只会执行一次,所以可以改进至一个选择而不是三种判断。另外本代码中,用到了goto语句实现了跳过错误的排列,曾经想过在permute(a,k

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论