上机复试练习day4 (中国科学技术大学&西北工业大学 2022.03.04)

229 阅读2分钟

中国科学技术大学&西北工业大学 上机题目

更多题目见相关专栏,复试前不定期更新

第一题:进制转换

要求:将一个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年数据结构考研复试指导 ————王道论坛