第一题:连续合数
最小的3个连续合数是8,9,10,最小的5个连续合数是24,25,26,27,28。输入数n(10<=n<=1000000),输出[1,n]上最长的连续合数。若存在多个个数相同的最长合数序列,输出值最小的前序合数(要求5s内输出结果)。
输入:50
输出:24 25 26 27 28
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int YON(int n){
int t=0;
for(int i=2; i<n; i++){
if(n%i == 0){
t = 1;
return 1;
}
}
return t;
}
typedef struct res{
int len;
int a[100005];
}res;
res r[1000005];
int main(int argc, const char * argv[]) {
int n;
scanf("%d", &n);
int b[1000005], k=0;
for(int i=4; i<=n; i++){
if(YON(i) == 1){
b[k] = i;
k++;
}
}
/*for(int i=0; i<k; i++){
printf("%d ", b[i]);
}
printf("\n");*/
int c = 0;
for(int i=0; i<k;){
int t = b[i], s=0;
r[c].a[s] = b[i];
s++;
for(int j=i+1; j<k; j++){
if(b[j] == t+1){
t = b[j];
r[c].a[s] = t;
s++;
}
else{
r[c].len = s;
break;
}
}
/*for(int p=0; p<s; p++){
printf("%d ", r[c].a[p]);
}
printf("\n%d\n", r[c].len);*/
c++;
i+=s;
}
int len = -1;
int p=c;
for(int i=c; i>=0; i--){
if(r[i].len >= len){
len = r[i].len;
p = i;
}
}
for(int i=0; i<r[p].len; i++){
printf("%d ", r[p].a[i]);
}
printf("\n");
return 0;
}
第二题:网络打印机
某单位信息网络结构呈树形结构,网络中结点可以为交换机,计算机,打印机三种设备,计算机和打印机只能位于树的叶结点上,若要从一台计算机上打印文档,请为它选择最近的打印机(经过交换机最少)。在该网络结构中,根交换机的编号为0,其他设备编号为任意有效正整数,每个交换机有8个端口(编号0-7),当存在多个满足条件的打印机时,选择按树前序遍历序排在前面的打印机。
输入:
当前网络中设备数m
<设备ID><设备类型><设备父节点ID><端口号>(类型:0表示交换机,1表示计算机,2表示打印机)
输出:
最近打印机的ID