c语言必刷代码题1


🎯适合基础小白,期末复习,计算机二级考试,考研复试…🚀

在这里插入图片描述

一、判断选取控制

1.1🤺a²+b²

题目:编制程序要求输入整数a和b,若a²+b²大于100,则输出a²+b²百位以上的数字,否则输出两数之和。

#include<stdio.h>
int main()
{
 int a,b;
//输入
 scanf("%d %d",&a,&b);
 if((a*a+b*b)>=100)
 //通过除法取高位
  printf("\n %d",(a*a+b*b)/100);
 else
  printf("\n %d",a+b);
}

1.2🤺同除357

题目:编程实现:输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一:
(1)能同时被3,5,7 整除;
(2)能被其中两数(要指出哪两个)整除;
(3)能被其中一个数(要指出哪一个)整除;
(4)不能被3,5,7任一个整除。

#include <stdio.h>

int main() {
    int num;
    scanf("%d", &num);
    // 判断能否被 3、5、7 整除
    int divisible_by_3 = num % 3 == 0;
    int divisible_by_5 = num % 5 == 0;
    int divisible_by_7 = num % 7 == 0;
    // 统计能被整除的个数
    int count = divisible_by_3 + divisible_by_5 + divisible_by_7;
    if (count == 3) {
        printf("能同时被3,5,7 整除\n");
    } else if (count == 2) {
        if (divisible_by_3 && divisible_by_5) {
            printf("能被其中两数(3和5)整除\n");
        } else if (divisible_by_3 && divisible_by_7) {
            printf("能被其中两数(3和7)整除\n");
        } else {
            printf("能被其中两数(5和7)整除\n");
        }
    } else if (count == 1) {
        if (divisible_by_3) {
            printf("能被其中一个数(3)整除\n");
        } else if (divisible_by_5) {
            printf("能被其中一个数(5)整除\n");
        } else {
            printf("能被其中一个数(7)整除\n");
        }
    } else {
        printf("不能被3,5,7任一个整除\n");
    }
    return 0;
}

1.3🤺switch

在这里插入图片描述

#include <stdio.h>

int main() {
    int x, y;
    printf("请输入一个整数x: ");
    scanf("%d", &x);
    switch (x > 0) {
    case 1:
        y = 1;
        break;
    case 0:
        switch (x == 0) {
        case 1:
            y = 0;
            break;
        case 0:
            y = -1;
            break;
        }
        break;
    }
    printf("y的值为: %d\n", y);
    return 0;
}

二、循环控制

2.1🤺同构数

试编程序,找出1至99之间的全部同构数。同构数是这样一组数:它出现在平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数。

#include <stdio.h>

int main() {
    int i;
    for (i = 1; i <= 99; i++) {
        int square = i * i;
        // 对于 1 到 9 的数,判断其平方的个位数是否等于该数
        if (i < 10) {
            if (square % 10 == i) {
                printf("%d 是同构数,其平方是 %d\n", i, square);
            }
        } 
        // 对于 10 到 99 的数,判断其平方的后两位数是否等于该数
        else {
            if (square % 100 == i) {
                printf("%d 是同构数,其平方是 %d\n", i, square);
            }
        }
    }
    return 0;
}

2.2🤺x^y的最后三位数

试编程序,求一个整数任意次方的最后三位数。即求x^y的最后三位数,要求
x,y从键盘输入。

#include <stdio.h>

int main() {
    int x, y;
    int result = 1;

    // 从键盘输入 x 和 y
    scanf("%d %d", &x, &y);

    // 计算 x 的 y 次方的最后三位数
    for (int i = 0; i < y; i++) {
        result = (result * x) % 1000;
    }

    // 输出结果
    printf("%d 的 %d 次方的最后三位数是:%03d\n", x, y, result);

    return 0;
}

🎈注意:为什么要在每次乘法后取模?
防止数值溢出:当 x 和 y 的值比较大时,x 的 y 次方可能会超出 int 类型所能表示的范围。例如,如果 x = 100,y = 10,100 的 10 次方是一个非常大的数(100000000000000000000),远远超出了 int 类型的最大值(通常是 2147483647)。而我们只关心这个结果的最后三位数,所以在每次乘法操作后对 1000 取模,就可以保证结果始终在 0 到 999 这个范围内,避免了数值溢出的问题。
不影响最后三位数的结果:根据取模运算的性质,一个数对 1000 取模得到的余数就是这个数的最后三位数。而且在求幂的过程中,每次乘法后取模不会影响最终结果的最后三位数。例如,假设我们要计算 (a * b * c) % 1000,可以先计算 (a * b) % 1000 = d,然后再计算 (d * c) % 1000,这样得到的结果和直接计算 (a * b * c) % 1000 是一样的。

2.3🤺学生平均成绩

编写程序,从键盘输入6名学生的5门成绩,分别统计出每个学生的平均成绩。

#include <stdio.h>

#define STUDENT_NUM 6
#define COURSE_NUM 5

int main() {
    int student, course;
    float score,sum,average;

    // 外层循环控制学生数量
    for (student = 1; student <= STUDENT_NUM; student++) {
        sum = 0;
        // 内层循环控制每一个学生的课程数量
        for (course = 1; course <= COURSE_NUM; course++) {
            printf("请输入第 %d 名学生的第 %d 门成绩: ", student, course);
            scanf("%f", &score);
            sum += score;
        }
        // 计算当前学生的平均成绩
        average = sum / COURSE_NUM;
        printf("第 %d 名学生的平均成绩是: %.2f\n", student, average);
    }

    return 0;
}

三、数组

3.1🤺统计每个整数个数

从键盘输入若干整数(数据个数应少于50),其值在0至4的范围内,用-1作为输入结束的标志。统计每个整数的个数。试编程。

#include <stdio.h>

#define MAX_INPUT 50

int main() {
    int numbers[5] = {0};  // 用于存储 0 - 4 每个整数的个数,初始化为 0
    int input;
    int count = 0;

    printf("请输入 0 至 4 范围内的整数,以 -1 结束输入:\n");

    while (count < MAX_INPUT) {
        scanf("%d", &input);
        if (input == -1) {
            break;  // 输入 -1 时结束循环
        }
        if (input >= 0 && input <= 4) {
            numbers[input]++;  // 对应整数的计数加 1
            count++;
        } else {
            printf("输入无效,请输入 0 至 4 范围内的整数。\n");
        }
    }

    // 输出每个整数的个数
    for (int i = 0; i < 5; i++) {
        printf("整数 %d 的个数是:%d\n", i, numbers[i]);
    }

    return 0;
} 

🎈计数统计思想
数组映射:利用数组 numbers 来记录每个特定整数(0 到 4)出现的次数。数组的下标与要统计的整数一一对应,例如 numbers[0] 用于统计整数 0 出现的次数,numbers[1] 用于统计整数 1 出现的次数,以此类推。这种通过数组下标来映射不同元素的方式,能够高效地进行计数统计,避免了使用复杂的逻辑判断来区分不同的整数。

3.2🤺每五个数平均值放入另一个数组

定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。

#include <stdio.h>

#define ARRAY_SIZE 30
#define GROUP_SIZE 5

int main() {
    int numbers[ARRAY_SIZE];
    float averages[ARRAY_SIZE / GROUP_SIZE];

    // 给数组 numbers 赋值从 2 开始的偶数
    for (int i = 0; i < ARRAY_SIZE; i++) {
        numbers[i] = 2 + 2 * i;
    }

    // 每五个数求一个平均值,并存入数组 averages
    for (int i = 0; i < ARRAY_SIZE / GROUP_SIZE; i++) {
        int sum = 0;
        for (int j = 0; j < GROUP_SIZE; j++) {
            sum += numbers[i * GROUP_SIZE + j];
        }
        averages[i] = (float)sum / GROUP_SIZE;
    }

    // 输出平均值数组
    printf("每五个数的平均值分别为:\n");
    for (int i = 0; i < ARRAY_SIZE / GROUP_SIZE; i++) {
        printf("第 %d 组平均值: %.2f\n", i + 1, averages[i]);
    }

    return 0;
}

3.3🤺输出下三角

通过循环按行顺序为一个5X5的二维数组a赋1到25的自然数,然后输出该数组的左下半三角。试编程。

#include <stdio.h>

#define ROWS 5
#define COLS 5

int main() {
    int a[ROWS][COLS];
    int num = 1;

    // 按行顺序为二维数组 a 赋 1 到 25 的自然数
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            a[i][j] = num++;
        }
    }

    // 输出数组的左下半三角
    printf("该数组的左下半三角为:\n");
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j <= i; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    return 0;
}

🎈输出昨下三角关键:对于左下半三角,列的范围是从 0 到当前行号 i(即 j <= i),输出满足条件的元素。

3.4🤺输出螺旋方阵

在这里插入图片描述

#include <stdio.h>

int main() {
    int n, i, j, num = 1, row_start = 0, row_end, col_start = 0, col_end;
    printf("请输入方阵的阶数 n (n < 10): ");
    scanf("%d", &n);
    row_end = n - 1;
    col_end = n - 1;
    int arr[10][10];

    while (num <= n * n) {
        // 从左到右
        for (j = col_start; j <= col_end; j++) {
            arr[row_start][j] = num++;
        }
        row_start++;
        // 从上到下
        for (i = row_start; i <= row_end; i++) {
            arr[i][col_end] = num++;
        }
        col_end--;
        // 从右到左
        for (j = col_end; j >= col_start; j--) {
            arr[row_end][j] = num++;
        }
        row_end--;
        // 从下到上
        for (i = row_end; i >= row_start; i--) {
            arr[i][col_start] = num++;
        }
        col_start++;
    }

    // 输出螺旋方阵
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%4d", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

🎈填充螺旋方阵:使用while循环,在方阵未填满(num <= n * n)时,按顺时针方向依次填充:
从左到右填充当前行,填充后row_start加 1。
从上到下填充当前列,填充后col_end减 1。
从右到左填充当前行,填充后row_end减 1。
从下到上填充当前列,填充后col_start加 1。
往里不断转!

3.4🤺 a中所有的后项除以前项之商

数组a包括10个整数,把a中所有的后项除以前项之商取整后存入数组b,并按每行3个元素的格式输出数组b。试编程。

#include <stdio.h>

#define ARRAY_SIZE 10

int main() {
    int a[ARRAY_SIZE];
    int b[ARRAY_SIZE - 1];
    int i;

    // 输入数组 a 的 10 个整数
    printf("请输入 10 个整数:\n");
    for (i = 0; i < ARRAY_SIZE; i++) {
        scanf("%d", &a[i]);
    }

    // 计算后项除以前项之商取整并存入数组 b
    for (i = 0; i < ARRAY_SIZE - 1; i++) {
        if (a[i] != 0) {
            b[i] = a[i + 1] / a[i];
        } else {
            // 处理除数为 0 的情况
            printf("错误:数组 a 中出现了 0,不能作为除数。\n");
            return 1;
        }
    }

    // 按每行 3 个元素的格式输出数组 b
    printf("数组 b 的元素为:\n");
    for (i = 0; i < ARRAY_SIZE - 1; i++) {
        printf("%d ", b[i]);
        if ((i + 1) % 3 == 0) {
            printf("\n");
        }
    }

    // 如果最后一行不足 3 个元素,手动换行
    if ((ARRAY_SIZE - 1) % 3 != 0) {
        printf("\n");
    }

    return 0;
}

3.5🤺折半查找法

从键盘输入一个字符,用折半查找法找出该字符在已排序的字符串a中的位置。若该字符不在a中,则打印出**。试编程。

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

// 折半查找函数
int binarySearch(char arr[], int left, int right, char target) {
    while (left <= right) {
        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid;  // 找到目标字符,返回其位置
        } else if (arr[mid] < target) {
            left = mid + 1;  // 目标字符在右半部分
        } else {
            right = mid - 1;  // 目标字符在左半部分
        }
    }
    return -1;  // 未找到目标字符
}

int main() {
    char a[] = "abcdefghijklmnopqrstuvwxyz";  // 已排序的字符串
    int len = strlen(a);
    char target;

    printf("请输入一个字符: ");
    scanf(" %c", &target);

    int position = binarySearch(a, 0, len - 1, target);

    if (position != -1) {
        printf("该字符在字符串中的位置是: %d\n", position);
    } else {
        printf("**\n");
    }

    return 0;
}

🎈解决整数溢出问题
使用 left + (right - left) / 2 可以避免这个问题。具体分析如下:
right - left 计算的是 right 和 left 之间的差值,这个差值通常不会超出 int 类型的表示范围。计算出差值后再除以 2,得到的是从 left 开始到中间位置的偏移量。最后将这个偏移量加到 left 上,就能得到中间位置 mid。

3.6🤺a串中的最大元素后边插入字符串b

从键盘输入一个字符串a,并在a串中的最大元素后边插入字符串b(b[ ]="ab”))。试编程

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

#define MAX_LEN 100

// 函数用于将字符串从指定位置后移
void shift_string(char *str, int start, int num_chars) {
    int len = strlen(str);
    for (int i = len; i >= start; i--) {
        str[i + num_chars] = str[i];
    }
}

int main() {
    char a[MAX_LEN];
    char b[] = "ab";
    int i, max_index = 0;

    // 从键盘输入字符串 a
    printf("请输入字符串 a: ");
    scanf("%s", a);

    // 找到字符串 a 中最大元素的索引
    for (i = 1; i < strlen(a); i++) {
        if (a[i] > a[max_index]) {
            max_index = i;
        }
    }

    // 计算要插入字符串 b 的长度
    int b_len = strlen(b);

    // 将最大元素后面的字符向后移动 b_len 个位置
    shift_string(a, max_index + 1, b_len);

    // 在最大元素后面插入字符串 b
    for (i = 0; i < b_len; i++) {
        a[max_index + 1 + i] = b[i];
    }

    // 输出插入后的字符串 a
    printf("插入后的字符串 a 为: %s\n", a);

    return 0;
}

🎈思路:就是找到最大元素下标,然后该下标后元素后移b的长度(提供位置插入b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱康代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值