当前位置: 首页 > article >正文

[编程题]16、偶数求和

目录

前言:

1、题目展示:

2、问题分析:

3、最终代码展示:


前言:

开新专栏了,讲解100道基础语法编程题

用c语言讲解

目的是复习c语言中的基础语法,为单片机中的c语言代码分析做铺垫

专栏链接:

c语言基础语法编程题_1zero10的博客-CSDN博客

1、题目展示:

2、问题分析:

先展示完整代码

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

int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) == 2) {
        // 生成偶数序列
        int* arr = (int*)malloc(n * sizeof(int));
        for (int i = 0; i < n; ++i) {
            arr[i] = 2 + 2 * i;
        }

        int first = 1; // 控制输出格式
        for (int i = 0; i < n; i += m) { // 处理每组
            int end = i + m > n ? n : i + m; // 计算当前组结束位置
            int sum = 0;
            for (int j = i; j < end; ++j) {
                sum += arr[j];
            }
            // 计算平均值(当前组元素数为 end-i)
            int avg = sum / (end - i);

            // 输出控制
            if (first) {
                printf("%d", avg);
                first = 0;
            }
            else {
                printf(" %d", avg);
            }
        }
        printf("\n"); // 每组测试数据换行
        free(arr); // 释放内存
    }
    return 0;
}

1、本题数列是首项为2,公差为2的等差数列

因此公式为

由此得到任一项的通式 2+2n

2、第9行,和上一节一样,

int* arr = (int*)malloc(n * sizeof(int));

通过malloc函数(注意包含头文件<stdlib.h>)开辟动态内存空间

参数列表是n * sizeof(int),参数的值是n*sizeof(int),也就是n个数所需要的字节数

由于malloc返回值是double类型的指针,要转成int类型的指针,因此malloc函数要写成(int*)

总的来看等号右边(int*)malloc(n * sizeof(int));的含义就解释清楚了

整个表达式的含义就是把malloc函数的int类型的指针赋值给指针变量arr

那么arr现在就是一个大小动态变化的数组了

3、10、11行,通过for循环和公式,把从第0项到第n-1项的偶数数列全部赋值给数组的第0个元素到第n-1个元素

4、定义一个标记,赋值为1

5、15-32行,分组,每m个数取平均值,同时保证输出格式是第一个数定格,然后每一个数之间有一个空格

下面具体分析

我们通过一个具体例子来逐步演示iend的变化,假设输入 n=5(数列是 [2,4,6,8,10])且 m=3,看看分组过程如何工作。

第一次循环:

  • i = 0

  • 计算 end = i + m = 0 + 3 = 3 → 3 < 5 → end = 3=i+m

  • 18行的for循环执行3次,把第0,1,2个元素加起来 sum = 2 + 4 + 6 = 12

  • 22行计算平均值 = 12 / 3 = 4 除以的是end-i,当最后i+m>n也就是下面第二次循环的情况时,也可以保证除以正确的数

第二次循环:

  • i += m → i = 0 + 3 = 3

  • 计算 end = 3 + 3 = 6 → 6 > 5 → end = 5=n

  • 18行的for循环执行2次,把第3,4个元素加起来 sum = 8 + 10 = 18

  • 平均值 = 18 / 2 = 9 除以的是end-i,当最后i+m>n也就是第二次循环的情况时,也可以保证除以正确的数

循环结束:

  • i += m → i = 3 + 3 = 6 → 6 >= 5=n 不满足15行的for循环,也就结束了所有分组 和求平均数的操作

 

最后这几行就是利用first标记来达到第一个数定格,后面每个数之间空一格空格的目的

free(arr)释放内存 arr变成了悬空指针,所以最好在34行后面把 arr设置为空指针

arr = NULL; // 避免悬空指针

3、最终代码展示:

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

int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) == 2) {
        // 生成偶数序列
        int* arr = (int*)malloc(n * sizeof(int));
        for (int i = 0; i < n; ++i) {
            arr[i] = 2 + 2 * i;
        }

        int first = 1; // 控制输出格式
        for (int i = 0; i < n; i += m) { // 处理每组
            int end = i + m > n ? n : i + m; // 计算当前组结束位置
            int sum = 0;
            for (int j = i; j < end; ++j) {
                sum += arr[j];
            }
            // 计算平均值(当前组元素数为 end-i)
            int avg = sum / (end - i);

            // 输出控制
            if (first) {
                printf("%d", avg);
                first = 0;
            }
            else {
                printf(" %d", avg);
            }
        }
        printf("\n"); // 每组测试数据换行
        free(arr); // 释放内存
    }
    return 0;
}

 

 

 

 


http://www.kler.cn/a/614328.html

相关文章:

  • 4月手机新品前瞻,影像,性能与设计卷得起飞
  • 图解AUTOSAR_SWS_SPIHandlerDriver
  • Git项目要改变仓库地址
  • 生成树和VRRP实验
  • 第十三章:面向对象思想(OOP)与面向过程思想的对比与应用
  • 如何缩短研发周期,降低研发成本?全星APQP软件为您提供解决方案
  • 29_项目
  • QML中使用Image显示图片和使用QQuickItem显示图片
  • 【C#】关键字 volatile
  • JVM - 垃圾回收器常见问题
  • 下一代数据工程:实时智能数据网格(Real-Time Data Mesh)
  • 【有外界干扰的BFS】经典题P2895Meteor Shower S
  • AI大模型、机器学习以及AI Agent开源社区和博客
  • [代码随想录] KMP 算法 28. 找出字符串中第一个匹配项的下标 459. 重复的子字符串
  • mac安装mongoDB的正确姿势
  • 智网安全:守护未来数字文明的基石
  • Vue3 配合 fullPage.js 打造高效全屏滚动网页
  • spring security认证流程分析
  • 对内核fork进程中写时复制的理解记录
  • 【Linux笔记】进程间通信——匿名管道||进程池