吉林大学高级语言设计2025级11.20OJ考试(下半场)
第一题:三角形判断
问题描述:
给定三个整数 a、b、c,表示三角形的三条边长。判断这三条边是否能构成一个合法的三角形。若可以,输出“yes”;否则输出“no”。
输入形式:
输入为三个整数 a、b、c,以空格分隔。
输出形式:
输出一行字符串:“yes” 或 “no”。
解题思路:
根据三角形的基本性质,任意两边之和必须大于第三边。因此只需验证以下三个条件是否同时成立:
- a + b > c
- a + c > b
- b + c > a
若全部满足,则可构成三角形。
代码实现:
#include <stdio.h>
int main() {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a + b > c && a + c > b && b + c > a) {
printf("yes");
} else {
printf("no");
}
return 0;
}
3 4 5
yes
1 2 3
no
第二题:较大的质因数
问题描述:
输入一个正整数 n,该数保证恰好由两个质数相乘得到。要求输出这两个质因数中较大的那个。
输入形式:
一个正整数 n,满足 6 ≤ n ≤ 2×10^9。
输出形式:
输出 n 的较大质因数。
样例说明:
例如,当 n = 15 时,其分解为 3 × 5,其中较大的质因数是 5。
解题思路:
由于题目限定 n 只能分解成两个质数的乘积,我们只需从最小的可能因子 2 开始枚举,找到第一个能整除 n 的质数 factor1,则另一个因子为 factor2 = n / factor1。随后比较两者大小,输出较大值即可。
代码实现:
#include <stdio.h>
#include <math.h>
int isPrime(int n) {
if (n <= 1) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0;
for (int i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) return 0;
}
return 1;
}
int main() {
int n;
scanf("%d", &n);
int factor1 = 0, factor2 = 0;
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0 && isPrime(i)) {
factor1 = i;
factor2 = n / i;
break;
}
}
if (factor1 > factor2) {
printf("%d", factor1);
} else {
printf("%d", factor2);
}
return 0;
}
15
5
第三题:输出数位上的数
问题描述:
输入一个整数 n(n < 10^9),要求从低位到高位依次输出它的每一位数字,数字之间用一个空格分隔,行末不允许有多余空格。
输入形式:
一个整数 n。
输出形式:
按从个位开始的顺序输出每一位数字,各数字间以单个空格分隔。
解题思路一:
特判 n = 0 的情况,直接输出 0。
使用数组存储每一位数字:通过取模和整除操作逐位提取个位、十位等,并存入数组。由于提取顺序本身就是从低位到高位,因此可以直接顺序输出数组元素,注意控制末尾无多余空格。
代码实现一:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n == 0) {
printf("0\n");
return 0;
}
int digits[10];
int count = 0;
while (n > 0) {
digits[count] = n % 10;
n /= 10;
count++;
}
for (int i = 0; i < count; i++) {
printf("%d", digits[i]);
if (i != count - 1) {
printf(" ");
}
}
return 0;
}
解题思路二:
无需额外数组,直接在循环中处理输出格式。利用变量记录当前是第几位,首次输出不加前导空格,后续每位前添加一个空格,从而避免结尾多出空格的问题。
代码实现二:
#include <stdio.h>
int main() {
int n, time = 0;
scanf("%d", &n);
while (n) {
if (time == 0) {
printf("%d", n % 10);
} else {
printf(" %d", n % 10);
}
n /= 10;
time++;
}
return 0;
}
12345
5 4 3 2 1
while