当前位置: 首页 > news >正文

重庆邮电大学笔试F021 考纲解析

1. 加法器与累乘器

#include <stdio.h>

// 加法器
int adder(int a, int b) {
    return a + b;
}

// 累乘器
int multiplier(int a, int b) {
    return a * b;
}

int main() {
    int a = 5, b = 3;
    printf("Sum: %d\n", adder(a, b));
    printf("Product: %d\n", multiplier(a, b));
    return 0;
}

2. 求最大数与最小数

#include <stdio.h>

void findMaxMin(int arr[], int n, int *max, int *min) {
    *max = arr[0];
    *min = arr[0];
    for (int i = 1; i < n; i++) {
        if (arr[i] > *max) *max = arr[i];
        if (arr[i] < *min) *min = arr[i];
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int max, min;
    findMaxMin(arr, 5, &max, &min);
    printf("Max: %d, Min: %d\n", max, min);
    return 0;
}

3. 排序(冒泡排序、选择排序等)

冒泡排序:
#include <stdio.h>

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {5, 2, 9, 1, 5, 6};
    int n = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, n);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

4. 大小写字母转换

#include <stdio.h>
#include <ctype.h>

void convertCase(char *ch) {
    if (isupper(*ch)) *ch = tolower(*ch);
    else if (islower(*ch)) *ch = toupper(*ch);
}

int main() {
    char ch = 'a';
    convertCase(&ch);
    printf("Converted case: %c\n", ch);
    return 0;
}

5. 判别键盘输入字符的类别

#include <stdio.h>
#include <ctype.h>

void checkCharType(char ch) {
    if (isalpha(ch)) {
        if (isupper(ch)) printf("Uppercase letter\n");
        else printf("Lowercase letter\n");
    } else if (isdigit(ch)) {
        printf("Digit\n");
    } else if (isspace(ch)) {
        printf("Whitespace\n");
    } else {
        printf("Special character\n");
    }
}

int main() {
    char ch = 'A';
    checkCharType(ch);
    return 0;
}

6. 判别闰年

#include <stdio.h>

int isLeapYear(int year) {
    return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
}

int main() {
    int year = 2020;
    if (isLeapYear(year)) {
        printf("%d is a leap year.\n", year);
    } else {
        printf("%d is not a leap year.\n", year);
    }
    return 0;
}

7. 百分制成绩与等级制成绩互相转换

#include <stdio.h>

void percentToGrade(int percent) {
    if (percent >= 90) printf("A\n");
    else if (percent >= 80) printf("B\n");
    else if (percent >= 70) printf("C\n");
    else if (percent >= 60) printf("D\n");
    else printf("F\n");
}

int main() {
    int percent = 85;
    percentToGrade(percent);
    return 0;
}

8. 求两个数的最大公因数和最小公倍数

#include <stdio.h>

int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

int main() {
    int a = 15, b = 20;
    printf("GCD: %d, LCM: %d\n", gcd(a, b), lcm(a, b));
    return 0;
}

9. 求菲比拉契数列有限项

#include <stdio.h>

void fibonacci(int n) {
    int a = 0, b = 1;
    for (int i = 0; i < n; i++) {
        printf("%d ", a);
        int temp = a;
        a = b;
        b = temp + b;
    }
}

int main() {
    int n = 10;
    fibonacci(n);
    return 0;
}

10. 统计学生成绩,包括总成绩、平均成绩、各分数段人数等

#include <stdio.h>

void analyzeScores(int scores[], int n) {
    int total = 0, A = 0, B = 0, C = 0, D = 0;
    for (int i = 0; i < n; i++) {
        total += scores[i];
        if (scores[i] >= 90) A++;
        else if (scores[i] >= 80) B++;
        else if (scores[i] >= 70) C++;
        else D++;
    }
    printf("Total: %d, Average: %.2f\n", total, total / (float)n);
    printf("Grade A: %d, Grade B: %d, Grade C: %d, Grade D: %d\n", A, B, C, D);
}

int main() {
    int scores[] = {95, 85, 76, 65, 90};
    analyzeScores(scores, 5);
    return 0;
}

11. 验证哥德巴赫猜想

#include <stdio.h>

int isPrime(int n) {
    if (n < 2) return 0;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

void goldbachConjecture(int n) {
    for (int i = 2; i <= n / 2; i++) {
        if (isPrime(i) && isPrime(n - i)) {
            printf("%d = %d + %d\n", n, i, n - i);
            return;
        }
    }
}

int main() {
    int n = 28;
    goldbachConjecture(n);
    return 0;
}

12. 用穷举法求某数段的素数、水仙花数、完全平方数等

#include <stdio.h>
#include <math.h>

// 判断是否为素数(质数)
// 质数定义为大于1且只能被1和自身整除的数
int isPrime(int n) {
    if (n <= 1)
        return 0;
    int i;
    // 只需判断到 sqrt(n) 即可
    int limit = (int)sqrt(n);
    for (i = 2; i <= limit; i++) {
        if (n % i == 0)
            return 0;
    }
    return 1;
}

// 判断是否为水仙花数(阿姆斯壮数)
// 通常定义:一个n位数,其各位数字的n次幂之和等于该数本身
int isNarcissistic(int n) {
    int original = n;
    int sum = 0;
    int count = 0;
    int temp = n;
    
    // 计算数字的位数
    while (temp > 0) {
        count++;
        temp /= 10;
    }
    
    temp = n;
    while (temp > 0) {
        int digit = temp % 10;
        // pow 返回 double 类型,这里转为 int 进行累加
        sum += (int)pow(digit, count);
        temp /= 10;
    }
    
    return (sum == original);
}

// 判断是否为完全平方数
// 完全平方数指存在整数 k,使得 k*k 等于 n
int isPerfectSquare(int n) {
    if (n < 0)
        return 0;
    int root = (int)sqrt(n);
    return (root * root == n);
}

int main() {
    int lower, upper;
    int i;
    
    // 输入区间下界和上界
    printf("请输入区间的下界和上界(例如:1 1000):");
    scanf("%d%d", &lower, &upper);
    
    // 输出区间内所有的素数
    printf("\n区间内的素数:\n");
    for (i = lower; i <= upper; i++) {
        if (isPrime(i))
            printf("%d ", i);
    }
    printf("\n");
    
    // 输出区间内所有的水仙花数
    printf("\n区间内的水仙花数:\n");
    for (i = lower; i <= upper; i++) {
        if (isNarcissistic(i))
            printf("%d ", i);
    }
    printf("\n");
    
    // 输出区间内所有的完全平方数
    printf("\n区间内的完全平方数:\n");
    for (i = lower; i <= upper; i++) {
        if (isPerfectSquare(i))
            printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}


13. 求近似数(如定积分、用牛顿迭代法或二分法或弦截法求多元方程的根)

弦截法(割线法)

#include <stdio.h>
#include <math.h>

double f(double x) {
    return x * x * x - x - 2;
}

double secant(double x0, double x1, double eps, int max_iter) {
    double x2;
    for (int i = 0; i < max_iter; i++) {
        if (fabs(f(x1) - f(x0)) < eps) break;
        x2 = x1 - f(x1) * (x1 - x0) / (f(x1) - f(x0));
        if (fabs(x2 - x1) < eps) return x2;
        x0 = x1;
        x1 = x2;
    }
    return x1;
}

int main() {
    double root = secant(1, 2, 1e-6, 100);
    printf("Approximate root using Secant Method: %.6f\n", root);
    return 0;
}

14. 求两个矩阵之和、之积

#include <stdio.h>

void matrixAdd(int a[2][2], int b[2][2], int result[2][2]) {
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            result[i][j] = a[i][j] + b[i][j];
        }
    }
}

void matrixMultiply(int a[2][2], int b[2][2], int result[2][2]) {
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            result[i][j] = 0;
            for (int k = 0; k < 2; k++) {
                result[i][j] += a[i][k] * b[k][j];
            }
        }
    }
}

int main() {
    int a[2][2] = {{1, 2}, {3, 4}};
    int b[2][2] = {{5, 6}, {7, 8}};
    int sum[2][2], prod[2][2];

    matrixAdd(a, b, sum);
    matrixMultiply(a, b, prod);

    printf("Matrix Sum:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d ", sum[i][j]);
        }
        printf("\n");
    }

    printf("Matrix Product:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d ", prod[i][j]);
        }
        printf("\n");
    }

    return 0;
}

15. 统计输入字符中的单词个数

#include <stdio.h>
#include <ctype.h>

int countWords(char str[]) {
    int count = 0, inWord = 0;
    for (int i = 0; str[i]; i++) {
        if (isalpha(str[i])) {
            if (!inWord) {
                count++;
                inWord = 1;
            }
        } else {
            inWord = 0;
        }
    }
    return count;
}

int main() {
    char str[] = "Hello, how are you today?";
    printf("Word count: %d\n", countWords(str));
    return 0;
}

16. 最近点对问题

最近点对问题通常使用分治法解决,这里给出一个暴力法的简单实现:通过计算每对点之间的距离来找出最近的两个点。

#include <stdio.h>
#include <math.h>

struct Point {
    int x, y;
};

double distance(struct Point p1, struct Point p2) {
    return sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

void closestPair(struct Point points[], int n) {
    double minDist = distance(points[0], points[1]);
    int p1 = 0, p2 = 1;

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            double dist = distance(points[i], points[j]);
            if (dist < minDist) {
                minDist = dist;
                p1 = i;
                p2 = j;
            }
        }
    }

    printf("Closest pair: (%d, %d) and (%d, %d) with distance: %.2f\n",
           points[p1].x, points[p1].y, points[p2].x, points[p2].y, minDist);
}

int main() {
    struct Point points[] = {{1, 1}, {2, 3}, {3, 4}, {5, 7}, {8, 8}};
    int n = sizeof(points) / sizeof(points[0]);
    closestPair(points, n);
    return 0;
}

17. 背包问题(0-1背包问题)

0-1背包问题的常见解法是动态规划。

#include <stdio.h>

int knapsack(int weights[], int values[], int n, int W) {
    int dp[n + 1][W + 1];

    // 初始化动态规划表
    for (int i = 0; i <= n; i++) {
        for (int w = 0; w <= W; w++) {
            if (i == 0 || w == 0)
                dp[i][w] = 0;
            else if (weights[i - 1] <= w)
                dp[i][w] = (values[i - 1] + dp[i - 1][w - weights[i - 1]] > dp[i - 1][w]) ?
                           (values[i - 1] + dp[i - 1][w - weights[i - 1]]) : dp[i - 1][w];
            else
                dp[i][w] = dp[i - 1][w];
        }
    }

    return dp[n][W];
}

int main() {
    int weights[] = {2, 3, 4, 5};
    int values[] = {3, 4, 5, 6};
    int W = 5;  // 背包的最大重量
    int n = sizeof(values) / sizeof(values[0]);
    
    printf("Maximum value: %d\n", knapsack(weights, values, n, W));
    return 0;
}

18. 多机调度问题

此问题可以通过贪心算法来解决,假设每个任务可以分配给多个机器,并尽量使任务分配平衡。

#include <stdio.h>

void multiMachineScheduling(int jobs[], int n, int m) {
    int machine[m];  // 记录每个机器的总工作量

    for (int i = 0; i < m; i++) {
        machine[i] = 0;  // 初始化所有机器的工作量为0
    }

    for (int i = 0; i < n; i++) {
        int minMachine = 0;
        for (int j = 1; j < m; j++) {
            if (machine[j] < machine[minMachine]) {
                minMachine = j;
            }
        }
        machine[minMachine] += jobs[i];  // 将工作分配给最空闲的机器
    }

    // 输出每个机器的总工作量
    for (int i = 0; i < m; i++) {
        printf("Machine %d: %d units\n", i + 1, machine[i]);
    }
}

int main() {
    int jobs[] = {5, 10, 15, 20, 25};
    int n = sizeof(jobs) / sizeof(jobs[0]);
    int m = 3;  // 机器数目
    multiMachineScheduling(jobs, n, m);
    return 0;
}

19. 最长公共子序列

使用动态规划来求解最长公共子序列问题。

#include <stdio.h>
#include <string.h>

int lcs(char *X, char *Y, int m, int n) {
    int dp[m + 1][n + 1];

    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0 || j == 0)
                dp[i][j] = 0;
            else if (X[i - 1] == Y[j - 1])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            else
                dp[i][j] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1];
        }
    }

    return dp[m][n];
}

int main() {
    char X[] = "ABCBDAB";
    char Y[] = "BDCABB";
    int m = strlen(X);
    int n = strlen(Y);

    printf("Length of LCS: %d\n", lcs(X, Y, m, n));
    return 0;
}

20. 连续子数组最大乘积

通过动态规划可以求解连续子数组的最大乘积问题。

#include <stdio.h>

int maxProductSubarray(int arr[], int n) {
    int max_prod = arr[0], min_prod = arr[0], result = arr[0];

    for (int i = 1; i < n; i++) {
        if (arr[i] < 0) {
            // 交换最大值和最小值
            int temp = max_prod;
            max_prod = min_prod;
            min_prod = temp;
        }

        max_prod = (arr[i] > max_prod * arr[i]) ? arr[i] : max_prod * arr[i];
        min_prod = (arr[i] < min_prod * arr[i]) ? arr[i] : min_prod * arr[i];

        result = (result > max_prod) ? result : max_prod;
    }

    return result;
}

int main() {
    int arr[] = {2, 3, -2, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("Maximum product subarray: %d\n", maxProductSubarray(arr, n));
    return 0;
}

http://www.dtcms.com/a/89071.html

相关文章:

  • 批量将PPT转换成多张图片
  • Qt6相对Qt5的主要提升(AI总结)
  • 军事级加密通信系统——基于QML的战术地图加密传输
  • Session模拟登录与退登
  • python安装教程
  • ETL:数据清洗、规范化和聚合的重要性
  • ATT 汇编常用指令
  • 微信小程序开发:页面结构与样式设计
  • JS深浅拷贝与性能优化
  • 如何在 Java 中查找 PDF 页面大小(教程)
  • Android Compose 状态保存(rememberSaveable、LocalSavedStateRegistry)框架深入剖析(十六)
  • stable diffusion本地安装
  • C#基础学习(四)笑谈C#函数:从“Hello World”到“千变万化”的奇幻之旅
  • 用Deepseek + Kimi 快速生成高质量的ppt
  • C Sharp上位机需要掌握哪些知识?
  • AI赋能:科技写作的革新之路
  • pandas中基于范围条件进行表连接
  • LVS NAT模式实现三台RS的轮询访问
  • 计算机二级web易错点(7)-选择题
  • CityEngine:3D城市建模专家
  • 【日语学习】助词で的七作用
  • 解决 Element UI 嵌套弹窗的状态管理问题!!!
  • 航天军工与金融行业 UE/UI 设计:跨越领域的体验革新之道
  • OFD转PDF:解决数字化文档兼容性的最佳途径
  • ActiveMQ 面试备战指南
  • 【QT】QTCreator测试程序
  • CSS 中 letter-spacing 不支持百分比
  • UniApp 表单校验两种方式对比:命令式与声明式
  • Perl语言的计算机网络
  • 【后端开发面试题】每日 3 题(二十)