作者:tANGjIAqIAN

题目1

#include <stdio.h>
long P(long n, long x) {
    if (n == 0) {
        return 1; //情况1
    } else if (n == 1) {
        return x; //情况2
    } else {
        return ((2 * n - 1) * P(n - 1, x) - (n - 1) * P(n - 2, x) / n); // 递归情况
    }
}

int main() {
    long n;
    long x;
    scanf("%ld %ld", &n, &x);
    printf("%ld", P(n, x)); // 由于题目示例输出是整数(而不是23.5),所以为整数输出
    
    return 0;
}

image

题目二

结果:5335
解释:
  swap1函数接受一个整数数组 c[] 作为参数,并在函数内部交换数组的前两个元素的值。由于数组在C语言中是按引用传递的,所以对数组元素的修改会反映到原数组上
  swap2函数接受两个整数参数 c0 和 c1,并在函数内部交换这两个值。但C语言的参数传递是按值传递的,函数内部对参数的修改不会影响到实参。因此,swap2 函数实际上并没有交换 b[0] 和 b[1] 的值。

题目三

错误的选项:C、E、F
解释:
C:C语言在运行时不会自动检查数组下标越界,故越界访问不会产生错误信息。
E:数组下标必须是整型,不能是其他类型的表达式。
F:在C语言中,编译器不会自动分配内存大小,除非使用动态内存分配,否则必须在声明数组时必须指定其大小。

题目四

错误的选项:B、E、H
解释:
B:选项中数组y被定义为有5个元素,但是初始化时提供了选项中数组y被定义为有6个元素,数组的大小必须与初始化元素的数量相匹配。
E:选项中使用双引号“”来初始化整数数组,但初始化应该使用花括号{}
H:选项中二维数组a被定义为2行3列,但是初始化时提供了3行2列的元素,数组的大小必须与初始化元素的数量和排列相匹配。

题目五

#include <stdio.h>

int main()
{
    char line[81]; // 假设每行最多80个字符加上一个空字符
    int upper = 0, lower = 0, digit = 0, space = 0, chinese = 0, others = 0;
    int i, line_count = 0;

    // 读取三行文本
    while (line_count < 3 && fgets(line, 81, stdin))
    {
        // 遍历这一行的每个字符
        for (i = 0; line[i] != '\0' && line[i] != '\n'; ++i)
        {
            if (line[i] >= 'A' && line[i] <= 'Z')
            {
                upper++;
            }
            else if (line[i] >= 'a' && line[i] <= 'z')
            {
                lower++;
            }
            else if (line[i] >= '0' && line[i] <= '9')
            {
                digit++;
            }
            else if (line[i] == ' ')
            {
                space++;
            }
            else if ((unsigned char)line[i] >= 0x80)
            {
                // 处理非ASCII字符,可能是中文或其他
                if (i + 2 < 81 &&
                    (unsigned char)line[i + 1] >= 0x80 && (unsigned char)line[i + 2] >= 0x80)
                {
                    // 检测是否是三字节 UTF-8 编码的中文字符
                    if ((unsigned char)line[i] >= 0xE0 && (unsigned char)line[i] <= 0xEF)
                    {
                        chinese++;
                        i += 2; // 跳过中文字符的两个字节
                    }
                    else
                    {
                        others++; // 如果不是中文,则为其他字符
                        i += 2;   // 跳过非中文的字符字节
                    }
                }
                else
                {
                    others++; // 处理单字节的非ASCII字符或不完整的UTF-8字符
                }
            }
            else
            {
                others++; // 其他不属于上述分类的字符
            }
        }
        line_count++;
    }

    // 输出统计结果
    printf("upper:%d\n", upper);
    printf("lower:%d\n", lower);
    printf("chinese:%d\n", chinese);
    printf("digit:%d\n", digit);
    printf("space:%d\n", space);
    printf("others:%d\n", others);

    return 0;
}

image

解释:不知道为什么,无论是vscode还是dev,程序的结果总是不对,但当我使用在线编程工具时,结果又是正确的。也许会单开一个链接研究吧。
点击查看一点碎碎念

题目六

#include <stdio.h>
#include <stdlib.h>

#define MAX 1000

// 比较函数,用于排序
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int n, m;
    
    // 输入集合A的长度和元素
    scanf("%d %d", &n, &m);
    int A[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &A[i]);
    }

    // 输入集合B的长度和元素
    int B[m];
    for (int i = 0; i < m; i++) {
        scanf("%d", &B[i]);
    }

    // 找出交集
    int intersection[MAX], k = 0;  // 用于存储交集,k是交集的元素个数

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (A[i] == B[j]) {
                intersection[k++] = A[i];
                break;  // 找到一个相等元素就跳出B的循环
            }
        }
    }

    // 如果交集不为空,排序并输出
    if (k > 0) {
        qsort(intersection, k, sizeof(int), compare);
        for (int i = 0; i < k; i++) {
            printf("%d", intersection[i]);
            if (i < k - 1) printf(" ");
        }
        printf("\n");
    } else {
        printf("{}\n");
    }

    return 0;
}

image

posted on 2024-12-01 23:20  GaPb  阅读(35)  评论(0)    收藏  举报