吉林大学计算机高级程序设计笔记
3.26日复试完,玩了一天,28日去了招聘会,因为自己没把握能不能考上,不管怎么样,先去找份工作,等待的过程太焦急了,今天去参加技术面试。
首先我先劝退一波,今年计专线是373分。
我专业课135,这个分数确实只能算是平均分,和我一起复试的最高有149的,普遍130多分,各位权当看看吧,高级程序设计部分的笔记,数据结构过两天再总结。
相关的专题
1,排列组合类题型,这类在软件专硕出现过,主要思想是交换再递归重排
//这是排列算法 方法1
void permutation(char *p, char * pbegin){if(*pbegin == '\0')printf("%s",p);else{for(char *ch = pbegin; *ch != '\0'; ch++){swap(*pbegin,*ch);permutation(p, pbegin+1);swap(*pbegin, *ch);}}
}//方法2,其实和方法1区别不大,换一种写法
void permutation(char*p, int k, int m){if(k == m)printf("%s",p);else{for(int i = k; i<=m ; i++){swap(*(p+k),*(p+i));permutation(p, k+1, m);swap(*(p+k),*(p+i));}}
}//如果去除重复的组合
bool Isswap(char *pbegin, char *pend){char *p;for(p = pbegin; p<pend; p++){if(*p == *pend)return false;}return true;
}
组合算法
const int N = m;
int temp[];
int a[];
void combine(int n, int m){ //从n个元素中选出m个if(m == 0){for(int i = 0; i<N; i++){cout<<temp[i];}cout<<endl;}else if(n<m)return;else{combine(n-1,m); //不选当前元素,从剩下的n-1中选出m个temp[m-1]=a[n-1];combine(n-1,m-1);//选择当前元素}
}
//另一种写法
void combine(int n, int m){for(int i = m; i<n; i++){temp[m-1] = a[i-1];if(m > 1)combine(i-1,m-1);else{for(int j = 0;j<N;j++)cout<<temp[j];}cout<<endl;}
}
2,幂集问题,这是软专考过的一个问题,顺便提一嘴,吉大命题喜欢把计专,软专,计学,软学,这些题目交叉考,所以建议各位无论是考什么,都要把这四项真题全部过一遍。
//这类题目涉及到位运算,不懂的可以先去看看相关的资料或视频void powerset(char *set, int size){int pow_size = 1<<size; // 2^size or pow(2,size)int counter,j;for(counter = 0; counter<pow_size; counter++){for(j=0; j<size; j++){if(counter&(1<<j))cout<<set[j];}cout<<endl;}
}
3,计算几何问题
- 矢量点积运算
- 矢量叉积运算
矢量点积运算
double Dot(point p1,point p2){ //这里p2 p1都是坐标return p1.x * p2.x + p1.y*p2.y;
}
若矢量点积运算结果
< 0 锐角
> 0 钝角
= 0 直角矢量叉积运算
double Det(point p1,point p2){return p1.x * p2.y - p1.y * p2.x;
} 结果
> 0 p1在p2顺时针
< 0 p1在p2逆时针
= 0 p1 p2共线,可以同向也可以反向顺便一提海伦公式(求三角形面积),a,b,c为三边长度,p为半周长p = (a+b+c)/2
s = sqrt(p*(p-a)*(p-b)*(p-c))
4,奇数幻方问题(这个问题出现在吉大推荐的高级程序设计那本书上)
罗伯法的具体方法如下:
把1(或最小的数)放在第一行正中;
按以下规律排列剩下的n2-1个数:
1)每一个数放在前一个数的右上一格;
2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
4)如果这个数(例如6)所要放的格已经超出了顶行且超出了最右列那么就把它放在它的下一行同一列的格内;
5)如果这个数所要放的格已经有数填入,处理方法同4)。
package test1;import java.util.Scanner;//奇数阶幻方的实现
public class Practice { //n为用户输入的n阶奇数幻方 n为奇数public static int[][] magicOdd(int n) { //构造一个(n+2)*(n+2)矩阵int[][] square = new int[n + 1][n + 1]; int i = 0; int j = (n + 1) / 2; //从第一行的中间那个数字(是1)开始填幻方//n阶幻方一共有n*n个数字(从1~n*n)//奇数阶幻方的实现算法for (int key = 1; key <= n * n; key++) { if ((key % n) == 1) i++; else { // //填充当前数的右上角那个数i--; j++; } if (i == 0) { 判断条件:若是在(n+2)*(n+2)阶方阵的第一行i = n; }if (j > n) {j = 1; }square[i][j] = key; } //对(n+2)*(n+2)阶的方阵进行筛选出中间的n*n阶幻方int[][] matrix = new int[n][n]; for (int k = 0; k < matrix.length; k++) { for (int l = 0; l < matrix[0].length; l++) { matrix[k][l] = square[k + 1][l + 1]; } } return matrix; } public static void main(String[] args) { Scanner a=new Scanner(System.in);int b=a.nextInt();//b为用户输入的奇数System.out.println(); int[][] magic = Practice.magicOdd(b); for (int k = 0; k < magic.length; k++) { for (int l = 0; l < magic[0].length; l++) { System.out.print(magic[k][l] + " "); } System.out.println(); } }
}
原文:https://blog.csdn.net/wilson_m/article/details/78643202
5,素数环(计学考过)
问题描述相邻两个整数之和均为素数,例如输入6,输出 1 4 3 2 5 6 最后一个数和第一个数和也为素数
void dfs(int cur){ //这是刘汝佳算法竞赛入门上的一道题目,应该好理解if(cur == n && isp(A[0]+A[n-1])){//递归边界for(int i = 0; i<n; i++)cout<<A[i]<<endl;}elsefor(int i = 1; i<=n; i++){if(!vis[i] && isp(i+A[cur-1])){A[cur] = i; vis[i] = 1; //标志已经访问过了dfs(cur+1);vis[i] = 0; //还原访问标记}}
}
接下来是一些常见的简单题型
1,分解质因子
//递归
void prim(int m, int n){ //n从2开始if(m >= n){while(m % n)n++;m/=n;prim(m,n);stack[++top] = n; //得到的倒序压入栈中}
}//非递归
void main(){int i,n;cout<<"please input n";cin>>n;for(i = 2; i<n ;i++){while(n != i){if(n%i == 0){cout<<i;n/=i;}elsebreak;}}cout<<n;return 0;
}
2,对一个n*n矩阵,通过行变换,使每行元素的平均值按递增排列
这里只列出核心算法for(i = 0;i<n;i++){sum[i] = 0; //初始化for(int j=0; j<n; j++)sum[i] = sum[i] + array[i][j];
}for(int i = 0; i<n-1;i++){min = i;for(j = i+1;j<n;j++){if(sum[min] > sum[j])min = j;}if(i != min){ //将array的第i行和j行交换,以及sum[i] sum[j] 交换,用到了选择排序的思想for(k = 0;k<n; k++){temp = array[i][k];array[i][k] = array[min][k];array[min][k] = temp;}}temp = sum[i];sum[i] = sum[min];sum[min] = temp;
}
3,蛇形阵,形如这种
这是在网上随便找的一张图片,这是先往下走的,还有先往右走的情况
下面代码是先往右走的
void snake_number(int A[N][N], int n){int i =0,j=0,k=1;while(i<n && j<n){while(i<n && j>-1){A[i][j] = k++; //右上->左下i++;j--; }if(j<0 && i<n)j=0; //j<0处理else{ //i=n 处理j = j+2;i = n-1;}while(i>-1 && j<n){ //左下->右上A[i][j] = k++;i--;j++;}if(i<0 && j<n)i=0; //i<0处理else{ //j = n处理i = i+2;j = n-1;}}
}
下面是大整数问题
1,大整数加法
#include<stdio.h>
#include<string.h>
char line1[210],line2[210];
int num1[210],num2[210];
int i,j,len1,len2;
int main(){scanf("%s%s",line1,line2);len1 = strlen(line1);len2 = strlen(line2);for(i = len1-1,j=0; i>=0 ; i--,j++)num1[j] = line1[i]-'0';for(i = len2-1,j=0; i>=0 ; i--,j++)num2[j] = line2[i]-'0';len1 = max(len1,len2);for(i = 0; i<len1;i++){num1[i] += num2[i];num1[i+1] += num1[i]/10;num1[i] %= 10;}while(!num1[i] && i>=0)i--;if(i==-1) cout<<"0";elsewhile(i>=0)cout<<num1[i--];return 0;
}
2,大整数减法
#include<stdio.h>
#include<string.h>
char line1[210],line2[210];
int num1[210],num2[210];
int i,j,len1,len2;
int main(){scanf("%s%s",line1,line2);len1 = strlen(line1);len2 = strlen(line2);for(i = len1-1,j=0; i>=0 ; i--,j++)num1[j] = line1[i]-'0';for(i = len2-1,j=0; i>=0 ; i--,j++)num2[j] = line2[i]-'0';int len = 1;while(len<=len1 || len<=len2){if(num1[len] >= num2[len])num3[len] = num1[len]- num2[len];else{num3[len] = 10 + num1[len] - num2[len];num1[len+1] -=1}len++;}while(!num3[i] && len>=0)len--;if(len==-1) cout<<"0";elsewhile(len>=0)cout<<num3[len--];return 0;
}
3,大整数乘法
前面的和上面是一样的,这里不再赘述for(int i = 0;i<len1;i++){for(int j = 0;j<len2;j++){ans[i+j] += num1[i] * num2[j];}
}
for(int i = 0;i<len1+len2;i++){if(ans[i] >= 10){ans[i+1] += ans1[i]/10;ans[i] %= 10;}
}
index = len1 + len2;
此处更新,博主上岸了,大家加油!!
传送门 吉大数据结构笔记
吉林大学计算机高级程序设计笔记相关推荐
- C++计算机高级程序设计语言
基本内容 面向过程与面向对象的区别 ※※ 链接 一.区别 编程思想不同 面向过程:是一种以过程为中心的编程思想.都是以什么正在发生为主要目标进行编程. 面向对象:是一类以对象作为基本程序结构单位的程序 ...
- JavaScript高级程序设计笔记01 | 第一章到第四章 | 关键字与保留字 | 数据类型 | 操作符 | 作用域
观前提示:大部分都是书上的内容,个人理解的部分的较少,看我的笔记还不如去看书 第二章 async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本.只对外部 ...
- javascript高级程序设计笔记
1.要讲一个值转换成其对应的Boolean类型 ,可以调用转型函数Boolean(). var message="hello world!"; var messageAsBoole ...
- js高级程序设计笔记——DOM扩展
DOM扩展 为了实现更多的功能,会有一些标准或专有的DOM扩展. 标准扩展主要有: SelectorAPI(选择符API) HTML5 Element Traversal(元素遍历) 一. 选择符AP ...
- javascript高级程序设计--笔记01
概述 JavaScript的实现包含三个部分: 1 核心(ECMAScript) 提供核心语言功能 2 文档对象模型(DOM) 一套提供了访问以及操作网页内容的API 3 浏览器对象模型( ...
- JS高级程序设计笔记——事件(一)
一.事件流 假设有如下HTML代码: <!DOCTYPE html> <html> <head><title>Event</title> & ...
- JavaScript高级程序设计笔记 - 第四章 变量 作用域 内存问题
4.1 基本类型和引用类型的值 基本类型: 简单的数据段 引用类型: 指那些可能有多个值构成的对象, 指保存在内存中的对象 4.1.2 复制变量值 除了保存的方式不同之外,在从一个变量向另一个变量复制 ...
- JavaScript高级程序设计笔记 事件冒泡和事件捕获
1.事件冒泡 要理解事件冒泡,就得先知道事件流.事件流描述的是从页面接收事件的顺序,比如如下的代码: <body><div> click me!</div> < ...
- Java高级程序设计笔记 • 【第6章 设计模式】
全部章节 >>>> 本章目录 6.1 设计模式 6.1.1 设计模式概述和分类 6.1.2 单列模式介绍 6.1.3 单例模式的实现 6.1.4 实践练习 6.2 单例模式 ...
最新文章
- linux 线程与CPU绑定
- python网上有免费资源吗_【转载】学习Python无从下手?最好的免费资源想要拿走...
- CVPR 2020 | CMU HKUST提出binary网络自动化搜索,同时实现超高压缩与高精度
- 基于Solr DIH实现MySQL表数据全量索引和增量索引
- 操作系统之文件管理:7、文件的系统层次
- .net 通过泛型取值
- 万字长文,SpringSecurity
- Android之ContentProvider数据存储
- 3dsMax中Vray渲染器法线贴图用法
- 盛大剥离新业务:陈大年控股
- 2345浏览器兼容模式怎么设置
- 2022软件测试自学路线分享,附完整资料,自学也能拿高薪哟
- IDEA中设置关闭标签页的快捷键
- 雷军《小米创业思考》读书笔记
- 手把手教你用Arcgis绘制地图【热力图】
- 传感器的使用_手柄_3、ros使用罗技f710无线控制手柄
- 中国修边压力机行业市场供需与战略研究报告
- vite2+vue3打包后浏览器打开跨域浏览器的错误
- python小学生编程小游戏打地鼠turtle
- 测试方法-静态,动态