22年+21年 计算机能力挑战赛初赛C语言程序题 题解

22年

第14题:答案:33

c 复制代码
#include<stdio.h>
int  x=1;
int f(int  a)
{   static int  x=2;
    int  n=0;
   if(a%2)
         { static int  x=3;n+=x++;  }
   else  
         { static int  x=5;n+=x++;  }
    return  n+x++;
 } 
void  main()
{   int  sum=x,i;
    for(i=0;i<4;i++) 
         sum+=f(i); 
    printf("%d",sum);
}

分析:

好的,让我们逐步分析这段代码,并计算出最终的答案。

首先,全局变量 x 被初始化为 1。

接下来是函数 f 的定义。在函数内部,有一个静态局部变量 x,并且有一个局部变量 n 初始化为 0。根据传入的参数 a 的奇偶性,选择不同的分支执行。当 a 为奇数时,x 被初始化为 3;否则 x 被初始化为 5。然后 n 的值加上 x 的值(并且 x 自增)。最后返回 n 加上 x 的值(并且 x 自增)。

在主函数 main 中,定义了一个整型变量 sum 并初始化为 x 的值(即 1),以及一个整型变量 i。然后使用 for 循环对 i 进行 4 次迭代,在每次迭代中将 sum 增加调用函数 f 传入 i 的返回值。最后使用 printf 打印出 sum 的值。

现在我们来逐步计算。

  1. 初始时,sum = 1,i = 0。
  2. 当 i = 0 时,调用 f(0):
    • 进入 f 函数,x 被初始化为 5,返回值为 5 + 5 = 10
    • sum += 10,此时 sum = 11
  3. 当 i = 1 时,调用 f(1):
    • 进入 f 函数,x 被初始化为 3,返回值为 3 + 3 = 6
    • sum += 6,此时 sum = 17
  4. 当 i = 2 时,调用 f(2):
    • 进入 f 函数,x 被初始化为 5,返回值为 5 + 5 = 10
    • sum += 10,此时 sum = 27
  5. 当 i = 3 时,调用 f(3):
    • 进入 f 函数,x 被初始化为 3,返回值为 3 + 3 = 6
    • sum += 6,此时 sum = 33

因此,最终的输出结果为 33。

第15题 答案:15

#include <stdio.h>

int f(int x)

{ int n;

if(x==1) return 1;

n = x+f(x-1);

return (n);

}

void main()

{

printf("%d",f(5));

}

程序的输出结果是( )。

分析

这段程序的输出结果是 15。

让我们来逐步分析这段代码。首先,函数 f 接受一个整型参数 x。在函数内部,如果 x 的值为 1,那么直接返回 1。否则,定义一个局部变量 n,并将其初始化为 x 加上调用 f 函数传入 x-1 的返回值。最后返回 n 的值。

在主函数 main 中,调用 f 函数并传入参数 5,并使用 printf 打印出其返回值。

现在我们来逐步计算。

  1. 调用 f(5):
    • 进入 f 函数,x 不等于 1,计算 n = 5 + f(4)
    • 调用 f(4):
      • 进入 f 函数,计算 n = 4 + f(3)
      • 调用 f(3):
        • 进入 f 函数,计算 n = 3 + f(2)
        • 调用 f(2):
          • 进入 f 函数,计算 n = 2 + f(1)
          • 调用 f(1):
            • 直接返回 1
          • f(2) 返回 2 + 1 = 3
        • f(3) 返回 3 + 3 = 6
      • f(4) 返回 4 + 6 = 10
    • f(5) 返回 5 + 10 = 15

因此,最终的输出结果是 15。

第15题

#include <stdio.h>

int f(int x)

{ int n;

if(x==1) return 1;

n = x+f(x-1);

return (n);

}

void main()

{

printf("%d",f(5));

}

程序的输出结果是( )。

21年程序设计大题:

输入两个整数x,y输出x,y中各位数重新组合可能形成的最小的数

输入:输入:只有一组,每组两个长度不超12位的正整数

输出:用x,y中的所有的数字位重新组合能形成最小的数(如果首位是0也要输出)

样例输入:

100 423

样例输出

001234

c 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

int main() {
    int x, y;
    char str[25];

    // 读取输入
    scanf("%d %d", &x, &y);

    // 将两个整数转换为字符串
    sprintf(str, "%d%d", x, y);

    // 对字符串进行排序
    qsort(str, strlen(str), sizeof(char), compare);

    // 输出重新组合后的最小数
    printf("%s\n", str);

    return 0;
}

分析

  1. 首先,我们需要读取两个整数 x 和 y。

  2. 将两个整数转换成字符串。我们可以使用sprintf函数将两个整数格式化为字符串,并将它们连接在一起。

  3. 接下来,我们需要对字符串进行排序,以便重新组合数字。我们使用C标准库中的qsort函数来实现排序。qsort函数需要传入待排序的数组(即字符串),数组的大小(字符串的长度),每个元素的大小(在这里是一个字符的大小),以及一个比较函数。比较函数用于指定排序的顺序。在这个例子中,我们使用了一个自定义的比较函数compare来按照字符的大小进行排序。

  4. 排序完成后,我们将排序后的字符串输出即可得到重新组合后的最小数。

整体上,该算法的步骤包括了读取输入、字符串转换、排序和输出结果。通过将整数转换为字符串,并对字符串进行排序,我们可以重新组合数字以得到最小的数。

写个一个程序统计从1到N这N个数中,以下三个条件都满足的数字x个数

  1. x是一个素数(如2,3,5,7...)
  2. x是一个对称的数 (如1,11,121,都是对称的数)
  3. x的所有数字和恰好是7的倍数(如7,16,25,34,43,61,70,115,)

输入:一个整数N(1<=N<=10000)

输出: 满足这三个条件的个数

样例输入:

20

样例输出

1

样例解释:

从1~20中素数有2,3,5,7,11,13,17,19,再结合条件2可以看到对称的数只有

2 3 5 7 11,又因为条件3,所以只有7满足要求,所以输出个数为1

c 复制代码
#include <stdio.h>
#include <stdbool.h>

// 判断素数
bool isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

// 判断是否为对称数
bool isSymmetric(int n) {
    int reverse = 0, original = n;
    while (n > 0) {
        reverse = reverse * 10 + n % 10;
        n /= 10;
    }
    return original == reverse;
}

// 统计满足条件的数字个数
int countNumbers(int N) {
    int count = 0;
    for (int i = 1; i <= N; i++) {
        if (isPrime(i) && isSymmetric(i)) {
            int sumOfDigits = 0, num = i;
            while (num > 0) {
                sumOfDigits += num % 10;
                num /= 10;
            }
            if (sumOfDigits % 7 == 0) {
                count++;
            }
        }
    }
    return count;
}

int main() {
    int N;
    scanf("%d", &N);
    int result = countNumbers(N);
    printf("%d\n", result);
    return 0;
}
  1. 从标准输入中读取一个整数N,表示我们要统计满足条件的数字个数的范围是从1到N。
  2. 程序进入main函数,声明了变量N和count,其中N用于存储输入的整数,count用于存储满足条件的数字个数。
  3. 程序使用scanf函数读取输入的整数N。
  4. 程序进入for循环,从1遍历到N。在每次迭代中:
    • 调用isPrime函数判断当前数字是否为素数。
    • 调用isPalindrome函数判断当前数字是否为对称数。
    • 调用sumOfDigits函数计算当前数字的各位数字之和,并判断是否为7的倍数。
    • 如果当前数字同时满足以上三个条件,则将count加1。
  5. for循环结束后,程序输出count,即满足条件的数字个数。
  6. 程序运行结束。

这个程序的核心思想是通过遍历从1到N的所有数字,依次判断每个数字是否满足条件,如果满足则累加到count中。最后输出count的值,即为满足条件的数字个数。

写个一个程序统计从1到N这N个数中,以下三个条件至少满足两个条件的数字x个数

  1. x是一个素数(如2,3,5,7...)
  2. x是一个对称的数 (如1,11,121,都是对称的数)
  3. x的所有数字和恰好是7的倍数(如7,16,25,34,43,61,70,115,)

输入:一个整数N(1<=N<=10000)

输出: 至少满足这三个条件之两个的个数

样例输入:

20

样例输出

9

样例解释:

条件1:从1~10 中素数为2,3,5,7,

条件2:对称的数为1,2,3,4,5,6,7,8,9

条件3:数字和为7的倍数:7

当输入一个整数 N 之后,程序会通过循环遍历从 1 到 N 的所有数字,对每个数字依次进行以下步骤:

  1. 判断是否为素数(isPrime 函数)

    • 如果当前数字小于等于 1,则不是素数,返回 false。
    • 否则,从 2 开始,逐个尝试将当前数字除以从 2 到 sqrt(n)(取整数部分)的数,如果能整除则返回 false,表示不是素数;如果都不能整除,则返回 true,表示是素数。
  2. 判断是否为对称数(isPalindrome 函数)

    • 将当前数字保存到临时变量 temp 中。
    • 使用 while 循环,对 temp 进行取余和整除操作,将数字反转存储到 reversed 变量中。
    • 比较反转后的数字与原数字是否相等,相等则返回 true,表示是对称数;否则返回 false,表示不是对称数。
  3. 计算各位数字之和(sumOfDigits 函数)

    • 使用 while 循环,对当前数字进行取余和整除操作,计算各位数字之和并保存到 sum 变量中。
  4. 在主函数中,将以上三个条件分别判断,并用 conditionCount 计数满足的条件数量。如果满足条件的数量大于等于 2,则 count 计数加一。

  5. 最后输出 count 的值,即满足条件的数字个数。

这段代码通过遍历从 1 到 N 的所有数字,分别判断其是否为素数、对称数以及各位数字之和是否能被 7 整除,并统计同时满足至少两个条件的数字个数。

c 复制代码
#include <stdio.h>
#include <stdbool.h>

// 判断一个数是否是素数
bool isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

// 判断一个数是否是对称的数
bool isPalindrome(int n) {
    int temp = n;
    int reversed = 0;
    
    while (temp != 0) {
        reversed = reversed * 10 + temp % 10;
        temp /= 10;
    }
    
    return reversed == n;
}

// 计算一个数的各位数字之和
int sumOfDigits(int n) {
    int sum = 0;
    
    while (n != 0) {
        sum += n % 10;
        n /= 10;
    }
    
    return sum;
}

int main() {
    int N;
    int count = 0;
    
    // 读取输入
    scanf("%d", &N);
    
    // 遍历从1到N的所有数字
    for (int i = 1; i <= N; i++) {
        int conditionCount = 0;
        
        if (isPrime(i)) {
            conditionCount++;
        }
        
        if (isPalindrome(i)) {
            conditionCount++;
        }
        
        if (sumOfDigits(i) % 7 == 0) {
            conditionCount++;
        }
        
        if (conditionCount >= 2) {
            count++;
        }
    }
    
    // 输出满足条件的个数
    printf("%d\n", count);
    
    return 0;
}

入N个人的语(chinese)数(math)外(english)考试成绩,请输出总分最低的学生和单科最低的学生,相同的成绩也要输出(按照原来的顺序)

输入: 一个整数n表示n个人的考试成绩(1<n<=1000),随后有n行,每行依次是这个学生的姓名,语文成绩,数学成绩,外语成绩(都是整数)

输出: 首先输出语文最低的人(可以并列),然后是数学最低的, 外语最低的,最后输出总分最低的人(可以并列)具体格式参考输出样例

输入样例

5

tom 100 99 98

alice 100 100 100

peter 89 89 100

jerry 60 100 100

cat 60 50 50

输出样例

lower chinese:

jerry(60)

cat(60)

lower math:

cat(50)

lower english:

cat(50)

lower score:

cat(160)

c 复制代码
#include <stdio.h>
#include <string.h>

struct Student {
    char name[100];
    int chinese;
    int math;
    int english;
    int total;
};

int main() {
    int n;
    printf("请输入学生人数:");
    scanf("%d", &n);

    struct Student students[n];

    // 输入每个学生的信息
    for (int i = 0; i < n; i++) {
        printf("请输入第%d个学生的姓名、语文成绩、数学成绩和英语成绩:", i+1);
        scanf("%s %d %d %d", students[i].name, &students[i].chinese, &students[i].math, &students[i].english);
        students[i].total = students[i].chinese + students[i].math + students[i].english;
    }

    // 找到各科目和总分最低的学生
    int chinese_min = students[0].chinese;
    int math_min = students[0].math;
    int english_min = students[0].english;
    int total_min = students[0].total;

    for (int i = 1; i < n; i++) {
        if (students[i].chinese < chinese_min) {
            chinese_min = students[i].chinese;
        }
        if (students[i].math < math_min) {
            math_min = students[i].math;
        }
        if (students[i].english < english_min) {
            english_min = students[i].english;
        }
        if (students[i].total < total_min) {
            total_min = students[i].total;
        }
    }

    // 输出语文最低成绩的学生
    printf("lower chinese:\n");
    for (int i = 0; i < n; i++) {
        if (students[i].chinese == chinese_min) {
            printf("%s(%d)\n", students[i].name, students[i].chinese);
        }
    }

    // 输出数学最低成绩的学生
    printf("lower math:\n");
    for (int i = 0; i < n; i++) {
        if (students[i].math == math_min) {
            printf("%s(%d)\n", students[i].name, students[i].math);
        }
    }

    // 输出英语最低成绩的学生
    printf("lower english:\n");
    for (int i = 0; i < n; i++) {
        if (students[i].english == english_min) {
            printf("%s(%d)\n", students[i].name, students[i].english);
        }
    }

    // 输出总分最低的学生
    printf("lower score:\n");
    for (int i = 0; i < n; i++) {
        if (students[i].total == total_min) {
            printf("%s(%d)\n", students[i].name, students[i].total);
        }
    }

    return 0;
}
  1. 首先,通过 scanf 函数获取输入的学生人数,并将其存储在变量 n 中。

  2. 声明了一个结构体 struct Student,用于存储学生的姓名、语文成绩、数学成绩、英语成绩和总分。

  3. 创建了一个长度为 n 的数组 students,用于存储每个学生的信息。

  4. 使用 for 循环,迭代 n 次,获取每个学生的姓名、语文成绩、数学成绩和英语成绩,并计算出总分,然后将这些信息存储在对应的 students 数组元素中。

  5. 初始化了变量 chinese_minmath_minenglish_mintotal_min,并将它们分别设置为第一个学生的语文成绩、数学成绩、英语成绩和总分。

  6. 使用 for 循环,从第二个学生开始遍历 students 数组,逐个比较找到最低的语文成绩、数学成绩、英语成绩和总分,并更新相应的最低值变量。

  7. 使用 for 循环,遍历 students 数组,输出语文成绩等于最低值的学生姓名和成绩。

  8. 同样地,使用 for 循环,输出数学成绩等于最低值的学生姓名和成绩。

  9. 再次使用 for 循环,输出英语成绩等于最低值的学生姓名和成绩。

  10. 最后,使用 for 循环,输出总分等于最低值的学生姓名和总分。

相关推荐
风影小子4 分钟前
注册登录学生管理系统小项目
算法
黑龙江亿林等保7 分钟前
深入探索哈尔滨二级等保下的负载均衡SLB及其核心算法
运维·算法·负载均衡
起名字真南9 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去9 分钟前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
lucy153027510799 分钟前
【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者
人工智能·科技·单片机·嵌入式硬件·算法·机器学习
tyler_download21 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~21 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#21 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透23 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man25 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang