2025年吉林大学计算机考研复试机试真题(解题思路 + AC 代码)
2025年吉林大学计算机考研复试机试真题
2025年吉林大学计算机考研复试上机真题
历年吉林大学计算机考研复试上机真题
历年吉林大学计算机考研复试机试真题
更多学校完整题目开源地址:https://gitcode.com/u014339447/pgcode
百度一下pgcode 即可查看,输入 “学校名称” 即可筛选该校历年机试真题,包括真题、ac代码、解题思路、视频讲解。

字符串的反码-吉林大学
题目描述
一个二进制数,将其每一位取反,称之为这个数的反码。
下面我们定义一个字符的反码。如果这是一个小写字符,则它和字符 ‘a’ 的距离与它的反码和字符 ‘z’ 的距离相同;如果是一个大写字符,则它和字符 ‘A’ 的距离与它的反码和字符 ‘Z’ 的距离相同;如果不是上面两种情况,它的反码就是它自身。
举几个例子,‘a’ 的反码是 ‘z’;‘c’ 的反码是 ‘x’;‘W’ 的反码是 ‘D’;‘1’ 的反码还是 ‘1’;‘ ′ 的反码还 是 ′ ' 的反码还是 ' ′的反码还是′’。
一个字符串的反码定义为其所有字符的反码。我们的任务就是计算出给定字符串的反码。
输入格式
输入每行都是一个字符串,字符串长度不超过 80 个字符。如果输入只有 ‘!’,表示输入结束,不需要处理。
输出格式
对于输入的每个字符串,输出其反码,每个数据占一行。
输入样例
Hello
JLU-CCST-2011
!
输出样例
Svool
QOF-XXHG-2011
#include <iostream>
#include <vector>
using namespace std;
char findfan(char c){
if(c>='a' && c<='z'){
int aux=c-'a';
return 'z'-aux;
}
else if(c>='A' && c<='Z'){
int aux=c-'A';
return c='Z'-aux;
}
else return c;
}
int main() {
vector<string> s;
while(1){
string a;
cin>>a;
if(a=="!") break;
s.push_back(a);
}
for(auto &i:s){
for(auto &j:i){
j=findfan(j);
}
}
for(auto i:s){
cout<<i<<endl;
}
return 0;
}
平方因子-吉林大学
题目描述
给定一个数 n {n} n,判定它是否有一个不为 1 的完全平方数因子。
也就是说,是否存在某个 k {k} k, k > 1 {k > 1} k>1,使得 k 2 {k^2} k2 能够整除 n {n} n。
输入格式
每行一个整数 n {n} n, 1 < n < 10000 {1 < n < 10000} 1<n<10000。
输出格式
对于每一个输入的整数,在单独的一行输出结果,如果有不为 1 的完全平方数因子,则输出 “Yes”,否则输出 “No”。请注意大小写。
输入样例
15
输出样例
No
#include <iostream>
using namespace std;
int main(){
int m;
cin>>m;
if(m>1&&m<10000){
for(int k=2;k*k<=m;k++){
int d=k*k;
if(m%d==0) {
cout<<"Yes";
return 0;
}
}
}
cout<<"No";
return 0;
}
三角形的边-吉林大学
题目描述
给定三个已知长度的边,确定是否能够构成一个三角形,这是一个简单的几何问题。我们都知道,这要求两边之和大于第三边。实际上,并不需要检验所有三种可能,只需要计算最短的两个边长之和是否大于最大那个就可以了。
这次的问题就是:给出三个正整数,计算最小的数加上次小的数与最大的数之差。
输入格式
每一行包括三个数据 a {a} a, b {b} b, c {c} c,并且都是正整数,均小于 10000。
输出格式
对于输入的每一行,在单独一行内输出结果 s {s} s。 s = min ( a , b , c ) + mid ( a , b , c ) − max ( a , b , c ) {s = \min(a,b,c) + \text{mid}(a,b,c) - \max(a,b,c)} s=min(a,b,c)+mid(a,b,c)−max(a,b,c)。上式中, min \min min 为最小值, mid \text{mid} mid 为中间值, max \max max 为最大值。
输入样例
1 2 3
输出样例
0
#include <iostream>
#include <set>
using namespace std;
int main(){
multiset<int> edge;
for(int i=0;i<3;i++){
int a;
cin>>a;
edge.insert(a);
}
int sum=0;
for(auto i=edge.begin();i!=edge.end();i++){
if(next(i)==edge.end()){
sum =sum-*i;
}
else{
sum +=*i;
}
}
cout<<sum;
return 0;
}
排列与二进制-吉林大学
题目描述
在组合数学中,我们学过排列数。
从 n {n} n 个不同元素中取出 m {m} m( m ≤ n {m \leq n} m≤n)个元素的所有排列的个数,叫做从 n {n} n 中取 m {m} m 的排列数,记为 p ( n , m ) {p(n, m)} p(n,m)。
具体计算方法为 p ( n , m ) = n ( n − 1 ) ( n − 2 ) … ( n − m + 1 ) = n ! ( n − m ) ! {p(n, m) = n(n-1)(n-2) \ldots (n-m+1) = \frac{n!}{(n-m)!}} p(n,m)=n(n−1)(n−2)…(n−m+1)=(n−m)!n!(规定 0 ! = 1 {0! = 1} 0!=1)。
当 n {n} n 和 m {m} m 不是很小时,这个排列数是比较大的数值,比如 p ( 10 , 5 ) = 30240 {p(10,5) = 30240} p(10,5)=30240。如果用二进制表示为 p ( 10 , 5 ) = 30240 = ( 111011000100000 ) 2 {p(10,5) = 30240 = (111011000100000)_2} p(10,5)=30240=(111011000100000)2,也就是说,最后面有 5 个零。
我们的问题就是,给定一个排列数,算出其二进制表示的后面有多少个连续的零。
输入格式
输入包含多组测试数据,每组测试数据一行。
每行两个整数, n {n} n 和 m {m} m, 0 < m ≤ n ≤ 10000 {0 < m \leq n \leq 10000} 0<m≤n≤10000, n = 0 {n=0} n=0 标志输入结束,该组数据不用处理。
输出格式
对于每个输入,输出排列数 p ( n , m ) {p(n, m)} p(n,m) 的二进制表示后面有多少个连续的零。每个输出放在一行。
输入样例
10 5
6 1
0 0
输出样例
5
1
#include<stdio.h>
int main(void){
int n,m,a=1,b=1,c,i,j,k;
int count=0;
while(scanf("%d %d",&n,&m) && (n!=0 || m!=0)){
a=1;
b=1;
count=0;
c=0;
if(n>0){
for(i=1;i<=n;++i){
a*=i;
}
for(j=1;j<=(n-m);++j){
b*=j;
}
}
c=a/b;
for(k=1;k<20;++k){
if(c%(1<<k)==0){
count++;
}
else{
break;
}
}
printf("%d\n",count);
}
return 0;
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)