代码均为自做
题目一
给定闭区间[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