2019北航机试

本文介绍了北航机试中的四道编程题目,包括素数等差序列的生成、网络设备间的最短路径计算、连续合数最长序列查找以及三叉树的叶子节点最短路径问题。内容涵盖了算法设计与实现,涉及数学和图论知识。
摘要由CSDN通过智能技术生成

代码均为自做

题目一

给定闭区间[a,b] ,要求输出 素数的等差序列,三个以上才算是序列
例如 [100,200] 会输出 151 157 163 和167 173 179
输入[1,100] 会有两个等差序列,3 5 7 和47 53 59。输出样式行末的空格保留。

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <vector>
using namespace std;
bool isPrime(int x) {
    // 判断素数
    if (x < 2) return false;
    for (int i = 2; i <= sqrt(x); i++) {
   
        if (x % i == 0) return false;
    }
    return true;
}
int main()
{
   
    int count = 0;
    int a, b;
    cin >> a >> b;
    int *prime;
    prime = new int[b-a]; // 保存[a,b]之间的素数
    // prime = (int*)malloc(sizeof(int) * (b-a));
    for (int i = a; i <= b; i++) {
   
        if (isPrime(i)) {
   
            prime[count] = i;
            count++;
        }
    }
    int cnt;
    for (int i = 0; i < count-1; i += cnt) {
   
        cnt = 1; // 等差素数列中的元素个数
        int tmp = prime[i+1] - prime[i]; // 公差为tmp
        for (int j = i+1; j < count; j++) {
   
            if (prime[j] - prime[i] == tmp * cnt) cnt++; // 如果可以加入数列,则添加
            else break;
        }
        if (cnt > 2) {
    // 数列的元素超过3个,输出,然后从该数列的下一个元素继续向下看
            for (int k = 0; k < cnt; k++) {
   
                cout << prime[i+k] << " ";
            }
            cout << endl;
        }
        else cnt = 1; // 否则从i+1继续向下看
    }

    delete prime;
    return 0;
}
题目二

一个网络中有三种设备:交换机、电脑和打印机,网络成树状,电脑和打印机只在叶子节点上。
首先输入一个数表示设备的个数
然后按照id,类型,父节点id,端口号依次输入每台设备
最后输入一个id(电脑),找距离这台电脑最近的打印机,如果有多个则按照前序遍历的顺序找到打印机
输出这台打印机的编号和从电脑到这台打印机的路径。

输入
8
1 0 0 0
2 0 1 1
3 0 1 2
4 0 1 3
5 1 4 3
6 1 3 1
7 2 3 2
8 2 3 3
5

输出
5 4 1 3 7

#include <iostream>
#include <vector>
#include <queue>
#include <stack>

using namespace std;
struct EquipmentNode {
   
    int id;
    int type; // 0:交换机 1:电脑 2:打印机
    int printerCnt; // 从此节点向下含有的打印机数量
    EquipmentNode *parent; // 父亲
    EquipmentNode *port1; // 端口
    EquipmentNode *port2;
    EquipmentNode *port3;
    EquipmentNode *port4;
    // 构造函数
    EquipmentNode(int id, int type, EquipmentNode *parent = NULL)
    : id(id), type(type), parent(parent) {
   
        printerCnt = 0;
        port1 = port2 = port3 = port4 = NULL;
    }
};
class Equips {
   
protected:
    EquipmentNode *root; // 根
    void rprint(EquipmentNode *r, int h) {
    // 递归打印树,肉眼检查建树是否有错误
        for (int i = 0; i < h; i++) cout << "   ";
        if (r == NULL) {
   
            cout << "[/]" << endl;
            return;
        }
        cout << r->id << endl; // 先打印根,再从左向右依次打印各个子树
        rprint(r->port1, h+1);
        rprint(r->port2, h+1);
        rprint(r->port3, h+1);
        rprint(r->port4, h+1);
        return;
    }
public:
    void insertEquip(int id, int type, int parent, int port) {
    // 插入节点
        if (parent == 0) {
    // 插入的是树根
            root = new EquipmentNode
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值