当前位置:   article > 正文

湖北专升本C语言编程题总结(1)

湖北专升本C语言编程题总结(1)

我是2024年专升本考生,本人自己在学习中总结的,不一定完全正确,仅作为个人学习记录,所有编程题无固定解法,可能有更好的方法,思维多变,仅供参考,如有错误,欢迎指出。

1、输出100以内所有的质数(素数),每行输出5个质数
  • 题目来自武汉纺织大学_2013-2014 2 C语言程序设计试卷
// Created by zjc on 2024/3/7 22:01

//4.输出100以内所有的质数,每行输出5个质数,(10分)

// 质数(素数)就是只能被1和其本身整除,1不是质数,例如:2,3,5,7,11,13
#include<stdio.h>

int main() {

    int i, j, count = 0;  //定义两个变量i,j作为循环,一个作为被取模数,一个为模数
    for (i = 2; i < 100; i++) { //在2到100之间找质数
        for (j = 2; j < i; j++) {
            if (i % j == 0) {   //试除法,能不能被j整除,从2开始找,直到等于x
                break; // 跳出内层循环
            }
        }
        if (i == j)   //找到和j相等也没有被整除的,证明是质数
        {
            printf("%d ", i);
            count++; // count用于计数
            if (count % 5 == 0) {   // 用于五行后进行换行
                printf("\n");
            }
        }
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
2、定义一个函数,求两个正整数×和 y的最大公约数,在主函数中输入这两个数后调用该函数
  • 题目来自武汉纺织大学_2013-2014 2 C语言程序设计试卷
  • 传统方法
// Created by zjc on 2024/3/7 16:38
#include<stdio.h>
//2.定义一个函数,求两个正整数×和 y的最大公约数,在主函数中输入这两个数后调用该函数。(10分)
int fun(int x,int y){
    int i,m;
    for (i = 1; i <= (x < y ? x : y); i++) {
        if ( x%i == 0 && y%i == 0) {
            m=i;
        }
    }
    return m;
}
int main() {
    int a, b, i, max=0, result = 0;
    // 18 24
    scanf("%d %d", &a, &b);
    result=fun(a,b);
    printf("%d", result);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 改进方法-递归:(欧几里得算法-求最小公约数)

这个函数使用欧几里得算法(Euclideanalgorithm)来计算最大公约数。该算法基于一个事实:两个整数的最大公约数与其中较小的那个数和两数相除的余数的最大公约数相同。

  1. 如果 b 等于0,那么 a 就是最大公约数(因为任何数和0的最大公约数就是该数本身)。
  2. 如果 b 不等于0,那么递归调用 gcd 函数,传入 ba 除以 b 的余数作为参数。

这个递归过程会持续进行,直到 b 变为0,此时递归终止,并返回 a 作为最大公约数。
在这里插入图片描述

  • 余数为0时,最后一次运算中的除数12就是 36和24的最大公约数。
    在这里插入图片描述
// Created by zjc on 2024/3/13 17:22
// 如果 b 等于0,那么 a 就是最大公约数(因为任何数和0的最大公约数就是该数本身)。
// 如果 b 不等于0,那么递归调用 gcd 函数,传入 b 和 a 除以 b 的余数作为参数。
int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

// 求最小公倍数
// 
int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}

int main() {
    int num1, num2, result1,result2;
    scanf("%d %d", &num1, &num2);
    result1 = gcd(num1, num2);
    result2 = lcm(num1, num2);
    printf("%d和%d的最大公约数为:%d,最小公倍数为:%d\n", num1, num2, result1,result2);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
3、求3行5列二维数组中的最小值,及最小值的行号和列号,并输出
  • 题目来自武汉纺织大学_2013-2014 2 C语言程序设计试卷
// Created by zjc on 2024/3/7 21:27

//3.求3行5列二维数组中的最小值,及最小值的行号和列号,并输出。(10分)
#include<stdio.h>

int main() {
    char str[3][5] = {{1, 3, 4, 5, 8},
                      {5, 7, 8, 8, 3},
                      {4, 5, 0, 6, 2},
    };
    int i, j, min = 0, row = 0, column = 0;
    min = str[0][0];
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 5; j++) {
            if (str[i][j] < min) {
                min = str[i][j];
                row = i;
                column = j;
            }
        }
    }
    printf("最小的值为%d,行数是%d,列数是%d",min,row,column);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
4、一个球从 100 米高度自由落下,每次落地后反跳回原高度的一半
  • 题目来自湖北文理学院理工学院 2021 年普通专升本考试C 语言程序设计样卷
// Created by zjc on 2024/3/13 11:44
//1.编写程序: 一个球从 100 米高度自由落下,每次落地后反跳回原高度的一半,再落下,
// 求它在第 10 次落地时,共经过多少米?第 10 次反弹多高?

#include<stdio.h>

int main() {
    // 反弹数据需要更能精确,所以使用浮点数
    float high = 100, sum = 0;
    int i;
    for (i = 10; i > 0; i--) {
        // 每次落下返回原来高度的一半
        high = high / 2;
        // 因为弹起来,落下去,所以高度*2
        sum += high * 2;
    }
    // 加上最开始的100米
    sum += 100;
    // 共经过了299.804688米,第10次反弹0.097656米
    printf("共经过了%f米,第10次反弹%f米", sum, high);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
5、编写程序:输入一个正整数,求它的所有素数因子。

素数因子,又称质数因子,是指一个数能够分解成几个素数相乘时,这些素数就是该数的素数因子。例如,对于数字12,它可以分解为3乘以4,而4还可以进一步分解为2乘以2,所以12的素数因子是3和2。

  • 题目来自湖北文理学院理工学院 2021 年普通专升本考试C 语言程序设计样卷
// Created by zjc on 2024/3/13 15:19
#include <stdio.h>

void PrimeNum(int n);                     /*求素数*/
int main() {
    int i;
    int a;
    // 任意输入一个整数
    scanf("%d", &a);
    // 从2开始到a,检查a是否能被这个范围内的每个数整除
    for (i = 2; i <= a; i++)                 /*从2开始找因子*/
    {
        // 如果a能被某个数i整除,则调用PrimeNum(i)函数。
        if (a % i == 0) {
            PrimeNum(i);
        }
    }
    return 0;
}

void PrimeNum(int n)                     /*是否是素数, 不是则退出函数,是则输出a的素数因子*/
{
    int j;
    for (j = 2; j < n; j++) {
        // 素数只能被本身和1整除,不包括2,在2-(n-1)范围进行判断
        // 被整除则不为素数,为真则返回,不输出
        if (n % j == 0)
            return;
    }
    printf("%d ", n);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
6、实现输入一行字符串s,分别统计其中英文字母、空格、数字和其他字符的个数(感觉不太会考)
  • 题目来自武汉纺织大学_2013-2014 2 C语言程序设计试卷
// Created by zjc on 2024/3/7 16:06
//1.编写程序,实现输入一行字符串s,分别统计其中英文字母、空格、数字和其他字符的个数。(10分)
#include <stdio.h>
#include <ctype.h> // 引入ctype.h头文件用于字符分类

int main() {
    char s[1000]; // 假设输入的字符串长度不超过999
    int letterCount = 0; // 英文字母计数
    int spaceCount = 0; // 空格计数
    int digitCount = 0; // 数字计数
    int otherCount = 0; // 其他字符计数

    printf("请输入一行字符串s: ");
    fgets(s, sizeof(s), stdin); // 使用fgets读取一行字符串,包括空格

    // 遍历字符串中的每个字符
    for (int i = 0; s[i] != '\0'; i++) {
        // 判断字符类型并计数
        if (isalpha(s[i])) { // isalpha检查是否是英文字母
            letterCount++;
        } else if (isspace(s[i])) { // isspace检查是否是空格
            spaceCount++;
        } else if (isdigit(s[i])) { // isdigit检查是否是数字
            digitCount++;
        } else {
            otherCount++; // 其他字符
        }
    }

    // 输出结果
    printf("英文字母个数: %d\n", letterCount);
    printf("空格个数: %d\n", spaceCount);
    printf("数字个数: %d\n", digitCount);
    printf("其他字符个数: %d\n", otherCount);

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
7、打印出所有的"水仙花数"
  • 题目来自湖北经济学院2021年《C语言程序设计》专升本精选模拟(一)
// Created by zjc on 2024/3/13 15:56
/*
    31、编写程序:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
    例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
    程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。(本题10分)
 */

#include<stdio.h>
int main(){
    int i,j,k,n;
    for(i=1;i<9;i++){
        for(j=0;j<10;j++){
            for(k=0;k<10;k++){
                // 利用变量保存这个三位数
                n=i*100+j*10+k;
                // 个,十,百位分贝相乘与进行比较,如果相同则输出
                if(n==(i*i*i)+(j*j*j)+(k*k*k)){
                    printf("%d\n",n);
                }
            }
        }
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
8、输入三个整数x, y,z,请把这三个数由小到大输出
  • 题目来自湖北经济学院2021年《C语言程序设计》专升本精选模拟(一)
    传统方法:
// Created by zjc on 2024/3/13 16:42

// 编写程序:输入三个整数x, y,z,请把这三个数由小到大输出。(本题14分)

#include<stdio.h>
int main() {
    int x, y, z, t;
    scanf("%d %d %d", &x, &y, &z);
    // 如果x>y就进行交换,那么第二小的数就到了第一位
    if (x > y) {
        t = x;
        x = y;
        y = t;
    }
    // 如果x>z再进行交换,得到最小的数
    if (x > z) {
        t = x;
        x = z;
        z = t;
    }
    // 第二大和第三大的数进行比较
    if (y > z) {
        t = y;
        y = z;
        z = t;
    }
    printf("从小到大的顺序是%d %d %d", x, y, z);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
9、输入一个不多于五位数的正整数,判断它是几位,并逆序输 出各位数字
  • 题目来自2021 年湖北专升本 c 语言模拟题
  • 传统方法
// Created by zjc on 2024/3/15 16:09
// 1.输入一个不多于五位数的正整数,判断它是几位,并逆序输 出各位数字

#include <stdio.h>
int main()
{
    long a, b, c, d, e, x;
    printf("请输入不多于5位的正整数:");
    scanf("%ld", &x);
    a = x / 10000;        //分解出万位
    b = x % 10000 / 1000;   //分解出千位
    c = x % 1000 / 100;     //分解出百位
    d = x % 100 / 10;       //分解出十位
    e = x % 10;           //分解出个位
    if (a != 0) {   //若a不为0,则说明这个数有万位,则为五位数
        printf("为 5 位数\n逆序为: %ld %ld %ld %ld %ld\n", e, d, c, b, a);
    }
    else if (b != 0) {//若b不为0,则说明这个数有千位,则为四位数
        printf("为 4 位数\n逆序为: %ld %ld %ld %ld\n", e, d, c, b);
    }
    else if (c != 0) {// 依次类推
        printf("为 3 位数\n逆序为:%ld %ld %ld\n", e, d, c);
    }
    else if (d != 0) {
        printf("为 2 位数\n逆序为: %ld %ld\n", e, d);
    }
    else if (e != 0) {
        printf("为 1 位数\n逆序为:%ld\n", e);
    }
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

改进后(循环判断位数):

#include <stdio.h>

int main() {
    int num, originalNum, digitCount = 0;
    printf("请输入一个不多于五位数的正整数:");
    scanf("%d", &num);
    originalNum = num; // 保存原始数值以便后续输出

    // 判断位数
    while (num > 0) {
        num /= 10;
        digitCount++;
    }

    // 逆序输出各位数字
    printf("这是一个%d位数:\n", digitCount);
    num = originalNum; // 恢复原始数值
    while (num > 0) {
        int digit = num % 10; // 取出当前最低位的数字
        printf("%d", digit);
        num /= 10; // 去掉已输出的最低位
    }
    printf("\n");

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
10、连接字符串,不能使用strcat函数
  • 题目来自2021 年湖北专升本 c 语言模拟题
// Created by zjc on 2024/3/17 17:00
// 写一个程序,将两个字符串连接起来,要求:不能使用strcat函数。
#include <stdio.h>

int main() {
    char str1[120], str2[120];
    int i = 0, j = 0;
    printf("input two strings:");
    gets(str1);
    gets(str2);
    // 判断str1的长度,到"\0"结束
    while (str1[i] != '\0')
        i++;
    while (str2[j] != '\0') {
        // 将str2从开头复制到str1后面
        str1[i] = str2[j];
        i++;
        j++;
    }
    //由于后面没有‘\0’,需要主动赋
    str1[i] = '\0';
    printf("The new string is:%s\n", str1);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
11、输入一个数N,判断是否为素数(与前面相同,少些步骤)
  • 题目来自黄冈师范学院(历年真题)
// Created by zjc on 2024/3/26 16:05
// 输入一个数N,判断是否为素数
#include <stdio.h>

int main() {
    int n, i;
    scanf("%d", &n);
    for (i = 2; i < n; i++) {
        if (n % i == 0)break;
    }
    if (n == i) {
        printf("%d是素数", n);
    } else printf("%d不是素数", n);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
12、有一个二维数组,输入i,j,求第i行和第j列的和
  • 题目来自黄冈师范学院(历年真题)
// Created by zjc on 2024/3/26 17:11

// 1:有一个二维数组,输入i,j,求第i行和第j列的和
#include<stdio.h>

int main() {
    int i, j, column, row, sum = 0;
    char str[3][5] = {{1, 3, 4, 5, 8},
                      {5, 7, 8, 8, 3},
                      {4, 5, 0, 6, 2},
    };
    // 接收 行和列
    scanf("%d %d", &row, &column);
    for (i = 0; i < 3; i++) { // 累加列
        sum += str[i][column];
    }
    for (j = 0; j < 5; j++) { // 累加行
        sum += str[row][j];
    }
    printf("%d", sum);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
13、求一个数的各个位数之和,递归或者不递归都行
  • 题目来自黄冈师范学院(历年真题)
  • 方式一:不采用递归
// Created by zjc on 2024/3/26 17:43

// 求一个数的各个位数之和,递归或者不递归都行

#include <stdio.h>

int sumOfDigits(int num) {
    int sum = 0;
    while (num != 0) {
        sum += num % 10; // 取出最后一位数字并加到总和中
        num /= 10;       // 去掉最后一位数字
    }
    return sum;
}

int main() {
    int num;
    printf("Enter a number: ");
    scanf("%d", &num);
    int sum = sumOfDigits(num);
    printf("Sum of digits: %d\n", sum);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

方式二:采用递归

#include <stdio.h>  
  
int sumOfDigitsRecursive(int num) {  
    if (num == 0) {  
        return 0; // 递归终止条件  
    } else {  
        return (num % 10) + sumOfDigitsRecursive(num / 10); // 递归调用,并累加最后一位数字  
    }  
}  
  
int main() {  
    int num;  
    printf("Enter a number: ");  
    scanf("%d", &num);  
    int sum = sumOfDigitsRecursive(num);  
    printf("Sum of digits: %d\n", sum);  
    return 0;  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述

14、闰年的判断方法(两个条件都满足)
  • 题目来自C语言程序设计(谭浩强-第四版)

1)年份能被4整除 ,但不能被100整除。

2)年份能被400整除。

#include<stdio.h>
int main()
{
    int y = 0;
    printf("请输入一个年份:");
    scanf("%d", &y);
    if (((y% 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
        printf("%d是闰年", y);
    else
        printf("%d不是闰年",y);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
15、设三角形三边长为a、b、c,并满足约束条件三边之和大于第三边,面积为Area
  • 题目来自C语言程序设计(谭浩强-第四版)
    海伦公式:
    在这里插入图片描述
#include <stdio.h>
#include <math.h>
int main()
{
    double a=2,b=2,c=3,p,s;
  
    if(a+b>c && a+c>b && b+c>a) //判断是否可以构成三角形。
    {
        p=(a+b+c)/2;//计算半周长
        s=sqrt(p*(p-a)*(p-b)*(p-c));//套用海伦公式,计算面积
        printf("面积为%lf\n", s);//输出结果
    }
    else printf("无法构成三角形\n");//输入不合法,提示。
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/415210
推荐阅读
相关标签
  

闽ICP备14008679号