中国科学技术大学&西北工业大学 上机题目
更多题目见相关专栏,复试前不定期更新
第一题:进制转换
要求:将一个10进制的数转换为2进制
输入格式:
一个10进制的数
输出格式:
对应的2进制数
思路:
#include "stdio.h"
int main() {
int num, m, c, i = 0;
int n = 2;
int a[32];
printf("输入一个整数:");
scanf_s("%d", &num);
m = num;
while (num > 0) {
c = (num % n);
a[i] = c;
num = num / n; i++;
}
printf("十进制数%d转换成二进制数是:", m);
for (i--; i >= 0; i--) {//将数组倒序输出
printf("%d", a[i]);
printf("\n");
}
return 0;
}
第二题:最短路径和花费
要求:给你n个点,m条边,每条边都有权值d和花费p,给你起点s和终点t,求出最短路径和对应的花费
输入格式:
第一行输入n,m 下面m行输入对应的权值和花费 最后一行输入起点和终点
输出格式:
最短路径和最短花费
思路:
写创建结构体(邻接矩阵),然后创建图,在用dijkstra算法求出最短路径和最低花费。
#include <stdio.h>
#include <math.h>
#define MAX 10000
#define INFINTY 65535 //用65535表示无穷大
int D[MAX];//最短路径的下标
int P[MAX];//最短路径的权值和
int C[MAX];//最短路径的花费和
int mincost=0;
int minpath=0;
typedef struct{//邻接矩阵的结构体
int arc[MAX][MAX];//邻接矩阵,也表示边表
int cost[MAX][MAX]
char vexs[MAX];//顶点表
int numvertexes,numedges;
}mgraph;
void createmgraph(mgraph *g){
int i,j,k,w,m;
printf("输入顶点数和边数:\n");
scandf("%d %d\n",&g.numvertexes,&g.numedges);//输入顶点数和边数
for(i=0;i<g.numvertexes;i++){//读入顶点信息,建立顶点表
scanf(&g.vexs[i]);
}
for(i=0;i<g.numvertexes;i++){
for(j=0,j<g.numvertextes;j++){
g.arc[i][j]=INFINTY; //初始化
g->cost[i][j]=INFINTY;
}
}
for(k=0;k<g.numedges;k++){
printf("请输入上下标和权以及花费");
scanf("%d %d %d %d",&i,&j,&w,&m);
g.arc[i][j]=w;
g.cost[i][j]=m;
g.arc[i][j]=g.arc[j][i];
g.cost[i][j]=g.cost[j][i];//无向图,矩阵对称
}
}
void shortestpath_dijkstra(mgraph g,int a,int b,int D[][],int P[][],int C[][]){//a和b分别表示出发点和终点
int v,,w,k,m;
int final1[MAX],final2[MAX];//一个表示a到w的最短路径,一个表示花费
if(b<a) swap(a,b);
for(v=0;v<g.numvertexes;v++){
final1[v]=0;
final2[v]=0;
(*D)[v]=g.arc[a][v];
(*P)[v]=0;
(*C)[v]=0;
}
(*D)[a]=0;
final1[a]=1;
for(v=1;v<g.numvertexes;v++){
m=INFINTY;
for(w=0;w<g.numvertexes;w++){
if(!final1[w]&&(*D)[w]<m){
k=w;
m=(*D)[w];
}
}
final1[k]=1;
final2[K]=1;
for(w=0;w<g.numvertexes;w++){
if(!=final1[w]&&(m+g.arc[k][w]<(*D)[w])){
(*D)[w]=m+g.arc[k][w];
(*C)[W]+=g.cost[k][w];
(*P)[w]=k;
}
}
}
mincost=final1[b];
minpath=final2[b];
}
int main(){
mgraph g;
int a,b;
createmgraph(mgraph *g);
scanf("%d %d",&a.&b);
shortestpath_dijkstra(g,a,b,D,P,C);
printf("%d %d",minpath,mincost);
return 0;
}
第三题:最大公约数
要求:输入n个整数,求出n个数的最小值,最大值的最大公约数,并输出
输入格式:
输入第一行n个数(都大于0),用空格隔开
输出格式:
最小值 最大值 最小公约数 用空格隔开
思路:
有多种方法可以求出最小公约数,方法如下
1.辗转相除法
int gcd(int a,int b){
itn temp;
if(a<b){
swap(a,b);
}
while(b!=0){
temp=a%b;
a=b;
b=temp;
}
return a;
}
2.穷举法
int gcd(int a,int b){
if(a==0){
return 0;
}
if(b==0){
return b;
}
int temp=(a>b)?b:a;
while(a%temp==0||b%temp==0){
temp--;
}
return temp;
}
3.辗转相除法递归法(推荐)
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
4.更相减损法
int gcd(int a,int b){
while(a!=b){
if(a>b){
a=a-b;
}
else if(a<b){
b=b-a;
}
}
return a;
}
最大值和最小值省略
第四题:快速排序
要求: 输入一组数据的个数,然后输入这组数据,排序后输出结果(要求使用快速排序)
输入格式:
同上
输出格式:
同上
思路:
就是正常数据结构的思路,给出快速排序的函数
void quicksort(int a,int low,int high){
if(low<high){
int i=low,j=high,pivot=a[low];
while(i<j){
while(i<j&&v[j]>=pivot){
--j;
}
if(i<j){
v[i++]=v[j];
}
while(i<j&&v[i]<=pivot){
++i;
}
if(i<j){
v[j--]=v[i];
}
}
v[i]=pivot;
quicksort(v,low,i-1);
quicksort(v,i+1,high);
}
}
参考书目
1.计算机软件相关专业复试指导 ————皮皮灰
2.2022年数据结构考研复试指导 ————王道论坛