2017年吉林大学软件学院软件工程学硕复试笔试题回忆
吉林大学软件学院学硕从2017年开始招生,复试为高级程序语言设计。
一、 验证哥徳巴赫猜想
输入一个大于等于 6 的偶数,偶数等于两个素数之和。
参考代码:
#include<iostream>
using namespace std;
int isPrime(int n){ //判断是否是素数
int i;
if(n == 1)
return 1;
else{
for(i = 2;i < n;i++)
if(n%i == 0) return 0;
return 1;
}
}
int main(){
int num;
cin>>num; //输入数
while((num%2 != 0)||(num < 6)){//判断数字是否满足要求
cout<<"Error! Please enter another num"<<endl;
cin>>num;
}
for(int i = 1;i < num;++i){
for(int j = 1;j < i;++j){
if(((i + j) == num) && isPrime(i) && (isPrime(j)))
cout<<i<<"+"<<j<<"="<<num<<endl;
}
}
return 0;
}
二、 求数列前100行之和
定义一个数列 k(n):
k[n]=
{
第一行 1 ,n=1
第二行 k(n- 1)×(- 2)+1 ,n 为偶数
第三行 k(n- 1)×(- 3)+1 ,n 为奇数
}
输出数列前 100 行之和。
参考代码:
#include<iostream>
using namespace std;
int k(int m){
int n;
if(m == 1){
return 1;
}
else if(m%2==0){
return (k(m-1)*(-2) + 1);
}
else if(m%2!=0)
return (k(m-1)*(-3) + 1);
}
int main(){
int sum = 0; //数列之和
for(int i = 1;i <= 100;++i){ //计算数列前100项之和
sum += k(i);
}
cout<<"sum = "<<sum<<endl;
return 0;
}
三、 求数字序列平台长度
给出一个数字序列,数字序列的平台长度就是数列中数字重复了几次,求出该数列平台的最长长度。
(注意:不要丢掉负数这种情况)
示例代码:
#include<bits/stdc++.h> //因为复试手写代码,建议使用该头文件,防止漏掉
using namespace std;
int main(){
string num;
cin>>num;
int arrayA[10] = {0},arrayB[10] = {0};
for(int i = 0;i < num.length();++i){
if(num[i] -'0' > 0 && num[i] != '-') //正数计数
arrayA[num[i] - '0']++;
if(num[i] == '-'){ //判断是否是负数
arrayB[abs(num[i + 1] - '0')]++;
i += 1;
}
}
int max = 0; //寻找最大值,也可以使用库函数
for(int i = 0;i < 10;++i)
if(max < arrayA[i])
max = arrayA[i];
for(int i = 0;i < 10;++i)
if(max < arrayB[i])
max = arrayB[i];
cout <<"max is "<<max<<endl;
return 0;
}
四、 输出数列 A 的前 100 项
数列 A 的定义:
- 数 1 是数列中的数;
- 若 x 是数列中得数,那么 2倍的x,3倍的x 也是数列中的数;
- 数列中无其他的数;
参考代码:
#include<stdio.h>
using namespace std;
int main()
{
int a[100000]={0},i,j;
a[1]=1;
for(i=1;i<50000;i++)
if(a[i])
{
a[2*i]=1;
if(3*i<100000)a[3*i]=1;
}
for(i=1,j=0;j<100;i++)
if(a[i])
{
printf("%8d",i);
j++;
}
printf("\n");
return 0;
}
2018年吉林大学软件学院软件工程学硕复试笔试题回忆
备注:笔试编程题目为手写,满分150分,时间为2小时。
一. “完数“判断(40分)
一个正整数的所有因子之和等于它本身,这样的数称为完数。如:1 + 2 + 3 = 6,则6为完数。输出100以内的所有完数。
参考代码:
#include<bits/stdc++.h> //包含所有库函数
using namespace std;
int isWholeNUM(int n){ //使用函数进行判断
int sum = 0;
for(int i = 1;i < n;++i){
if(n%i == 0)
sum += i;
}
if(sum == n) return 1;
else return 0;
}
int main(){
for(int i = 1;i < 100;++i){
if(isWholeNUM(i))
cout<<i<<endl;
}
return 0;
}
二. 序列输出(40分)
假定序列满足:
- 第一位数是1;
- 第二位数是2;
- 奇数位为前两项之和,偶数项为前两项之差;
将100以内序列按递增排序并输出
参考代码:
#include<bits/stdc++.h>
using namespace std;
int r_list(int n){
if(n == 1)
return 1;
else if(n == 2)
return 2;
else if(n%2 != 0)
return r_list(n - 1) + r_list(n -2);
else if(n%2 == 0)
return r_list(n - 1) - r_list(n -2);
}
int main(){
int num;
/*Vector类 是在 java 中可以实现自动增长的对象数组,
vector在C++标准模板库中的部分内容,它是一个多功能的,
能够操作多种数据结构和算法的模板类和函数库。*/
vector<int> array;
for(int i = 1;i <= 100;++i){
num = r_list(i);
array.push_back(num);//在array数组的最后边添加一个数
}
sort(array.begin(),array.end());//默认顺序就是从小到大
for(int i = 0;i < array.size();++i)
cout<<array[i]<<endl;
return 0;
}
三. 最短线段(40分)
平面上存在100个点,任意两点之间可以连接成一条线段。假设存在点(x1,y1),点(x2,y2),则两点之间的距离公式为
(x1−x2)2+(y1−y2)2−−−−−−−−−−−−−−−−−−−√
求所有线段中的最短线段
参考代码:
#include<bits/stdc++.h>
using namespace std;
struct point{
int x;
int y;
} array[99]; //包含100个点,从0开始
int main(){
int length = 0,max = 0;
for(int i = 0;i < 100;++i) //输入100个点的坐标
cin>>array[i].x>>array[i].y;
for(int i = 0;i < 100;++i){ //计算100个点之间所有组合的线段长度
for(int j = 0;j < 100;++j){
length = (array[i].x - array[j].x)^2 + (array[i].y - array[j].y)^2;
if(max < length)
max = length;
}
}
cout<<sqrt(max);
return 0;
}
四. 0串数目(30分)
输入一段序列,连续两个0及以上称为0串。假如为001000,其中0串的数目为2。输入以2为结束,问序列中是否存在两个或两个以上的0串
#include<bits/stdc++.h>
using namespace std;
int main(){
string num;
int m = 0,n = 0;
// while((cin>>num) != '2'); //题意要求应该是这样,当输入2时自动终止输入,但是报错
cin>>num; //因此手工输入
for(int i = 0;i < num.length();++i){
if(num[i] == '0')
m++;
else
m = 0;
if(m >= 2 && num[i + 1] != '0')
n++;
}
if(n >= 2)
cout<<"OK"<<endl;
else
cout<<"No"<<endl;
return 0;
}