重庆邮电大学笔试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;
}