全部版块 我的主页
论坛 经济学人 二区 教师之家与经管教育
103 0
2025-11-21

吉林大学高级语言设计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
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群