C语言程序设计-2 程序的灵魂—算法

news2024/11/27 14:39:16

【例 2.1】求 1×2×3×4×5。
最原始方法:
步骤 1:先求 1×2,得到结果 2。
步骤 2:将步骤 1 得到的乘积 2 乘以 3,得到结果 6。
步骤 3:将 6 再乘以 4,得 24。
步骤 4:将 24 再乘以 5,得 120。
这样的算法虽然正确,但太繁。
改进的算法:
S1: 使 t=1
S2: 使 i=2
S3: 使 t×i, 乘积仍然放在在变量 t 中,可表示为 t×i→t
S4: 使 i 的值+1,即 i+1→i
S5: 如果 i≤5, 返回重新执行步骤 S3 以及其后的 S4 和 S5;否则,算法结束。
如果计算 100!只需将 S5:若 i≤5 改成 i≤100 即可。
如果该求 1×3×5×7×9×11,算法也只需做很少的改动:
S1: 1→t
S2: 3→i
S3: t×i→t
S4: i+2→t
S5:若 i≤11, 返回 S3,否则,结束。
该算法不仅正确,而且是计算机较好的算法,因为计算机是高速运算的自动机器,实现循环
轻而易举。
思考:若将 S5 写成:S5:若 i<11, 返回 S3;否则,结束。

#include <math.h>
#include <stdio.h>

int main()
{
    int t = 1;
    int i = 3;

    // 求 1×2×3×4×5 的
    // while (i <= 5) {
    //     t *= i;
    //     i += 1;
    // }

    // 求 100! (1×2×...×100) 的变种
    // while (i <= 100)
    // {
    //     t *= i;
    //     i += 1;
    // }
    // 计算1×3×5×7×9×11的乘积:
    while (i <= 11)
    {
        t *= i;
        i += 2;
    }

    printf("乘积结果是: %d\n", t);

    return 0;
}

【例 2.2】有 50 个学生,要求将他们之中成绩在 80 分以上者打印出来。
如果,n表示学生学号,ni表示第个学生学号;g表示学生成绩,gi表示第个学生成绩;
则算法可表示如下:
S1: 1→i
S2: 如果gi≥80,则打印ni和gi,否则不打印
S3: i+1→i
S4:若 i≤50, 返回 S2,否则,结束。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// #include "../../tools/tools/String/array_to_string.h"

#define NUM_STUDENTS 50

int main() {
    int student_ids[NUM_STUDENTS];
    int scores[NUM_STUDENTS];
    int i;

    int arr[] = {1, 2, 3, 4, 5};

    // 初始化随机数种子
    srand(time(NULL));

    // 填充学生学号,这里简单从1到50
    for (i = 0; i < NUM_STUDENTS; i++) {
        student_ids[i] = i + 1;
        
    }

    // int size = sizeof(student_ids) / sizeof(student_ids[0]);
    // char* str = array_to_string(student_ids, size);

    // 生成随机成绩(例如,介于0到100之间)
    for (i = 0; i < NUM_STUDENTS; i++) {
        scores[i] = rand() % 101; // %101 保证范围在0-100
    }

    // 打印80分以上的学生信息
    printf("成绩80分以上的学生信息:\n");
    for (i = 0; i < NUM_STUDENTS; i++) {
        if (scores[i] >= 80) {
            printf("学生学号: %d, 成绩: %d\n", student_ids[i], scores[i]);
        }
    }

    return 0;
}

【例 2.3】判定 2000 — 2500 年中的每一年是否闰年,将结果输出。
润年的条件:

1. 能被 4 整除,但不能被 100 整除的年份;
2. 能被 100 整除,又能被 400 整除的年份;
设 y 为被检测的年份,则算法可表示如下:
S1: 2000→y
S2:若 y 不能被 4 整除,则输出 y“不是闰年”,然后转到 S6
S3:若 y 能被 4 整除,不能被 100 整除,则输出 y“是闰年”,然后转到 S6
S4:若 y 能被 100 整除,又能被 400 整除,输出 y“是闰年” 否则输出 y“不是闰年”,
然后转到 S6
S5:输出 y“不是闰年”。
S6:y+1→y
S7:当 y≤2500 时, 返回 S2 继续执行,否则,结束。

在这里插入图片描述

int main() {
    int y = 2000; // S1: 初始化年份为2000

    while (y <= 2500) { // S7: 当y小于等于2500时循环执行
        // S2: 判断能否被4整除
        if (y % 4 != 0) {
            printf("%d不是闰年\n", y); // 输出不是闰年
        } else {
            // S3: 能被4整除,继续判断能否被100整除
            if (y % 100 != 0) {
                printf("%d是闰年\n", y); // 输出是闰年
            } else {
                // S4: 能被100整除,再判断能否被400整除
                if (y % 400 == 0) {
                    printf("%d是闰年\n", y); // 输出是闰年
                } else {
                    printf("%d不是闰年\n", y); // 否则,不是闰年
                }
            }
        }

        y++; // S6: 年份加1,准备检查下一年
    }

    return 0;
}

【例 2.4】求 100
1 - 1/2 - 1/3 + … + 1/100
算法可表示如下:
S1: sigh=1
S2: sum=1
S3: deno=2
S4: sigh=(-1)×sigh
S5: term= sigh×(1/deno )
S6: term=sum+term
S7: deno= deno +1
S8:若 deno≤100,返回 S4;否则,结束。

    double sum = 1.0;  // S1: 初始化总和为1.0,首项为1
    int sign = -1;     // S2: 初始化符号变量,首项后开始为负
    int deno = 2;      // S3: 初始化分母为2,从第二项1/2开始

    printf("计算过程:\n");
    // S4-S8: 循环计算直到分母达到101(包括1/100这一项)
    while (deno <= 100) {
        double term = (double)sign / deno; // S5: 计算当前项,并考虑符号
        // 更清晰地展示计算过程,但需注意浮点数精度限制
        printf("Step %2d: Term = %+.10lf (as fraction ~ %+.10lf/%d)\n", deno-1, term, sign, deno);
        sum += term;                     // S6: 累加到总和
        sign *= -1;                      // S7: 反转符号,准备计算下一项
        deno++;                         // S8: 分母递增
    }

    // 输出结果
    printf("\n计算结果为: %.10lf\n", sum);

    return 0;

【例 2.5】对一个大于或等于 3 的正整数,判断它是不是一个素数。
算法可表示如下:
S1: 输入 n 的值
S2: i=2
S3: n 被 i 除,得余数 r
S4:如果 r=0,表示 n 能被 i 整除,则打印 n“不是素数”,算法结束;否则执行 S5
S5: i+1→i
S6:如果 i≤n-1,返回 S3;否则打印 n“是素数”;然后算法结束。
改进:
S6:如果i≤ n ,返回S3;否则打印n“是素数”;然后算法结束。

int main() {
    int n, i = 2;
    printf("请输入一个大于或等于3的正整数: ");
    scanf("%d", &n);

    // 算法实现
    if (n < 3) {
        printf("%d 不符合输入要求(应大于或等于3的正整数)。\n", n);
    } else if (n == 3) {
        printf("%d 是素数。\n", n);
    } else if (n % 2 == 0) {
        printf("%d 不是素数。\n", n);
    } else {
        // 从3开始检查到n本身,步长为2,因为偶数已排除
        for (; i <= n; i += 2) {
            if (n % i == 0) {
                printf("%d 不是素数。\n", n);
                return 0; // 一旦发现有因子,直接结束
            }
        }
        }
        printf("%d 是素数。\n", n);
    return 0;

    }

流程图表示算法,直观形象,易于理解。
在这里插入图片描述
【例 2.6】将例 2.1 求 5!的算用流程图表示。
在这里插入图片描述
【例 2.7】将例 2.2 的算用流程图表示。
在这里插入图片描述
【例 2.8】将例 2.3 判定闰年的算用流程图表示。
在这里插入图片描述

将例 2.4 求 1-1/2+1/3-1/4+1/99-1/100
的算用流程图表示。
一个流程图包括:

1. 表示相应操作的框;
2. 带箭头的流程线;
3. 框内外必要的文字说明。

在这里插入图片描述

我们的任务是用计算机解题,就是用计算机实现算法;
用计算机语言表示算法必须严格遵循所用语言的语法规则。
【例 2.20】求 1×2×3×4×5 用 C 语言表示。

main()
{
    int i, t;
    t = 1;
    i = 2;
    while (i <= 5)
    {
        t = t * i;
        i = i + 1;
    }
    printf(% d”, t);
}

【例 2.21】求级数的值。

main()
{
    int sigh = 1;
    float deno = 2.0, sum = 1.0, term;
    while (deno <= 100)
    {
        sigh = -sigh;
        term = sigh / deno;
        sum = sum + term;
        deno = deno + 1;
    }
    printf("% f", sum);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python自动化(2)——键盘模拟

Python自动化(2)——键盘模拟 前台键盘模拟 前台键盘模拟和后台键盘模拟的区别在于&#xff0c;是否绑定窗口。即前台模拟是只模拟键盘操作&#xff0c;例如按下按键a&#xff0c;如果聚焦在一个文本文档的编辑区&#xff0c;那么就会把这个a输入进去。但如果是聚焦到了浏览器…

测试辅助工具(抓包工具)的使用1 之初识抓包工具(fiddler)

1.什么是抓包&#xff1f; 说明&#xff1a;客户端向服务器发送请求以及服务器响应客户端的请求,都是以数据包来传递的。 抓包&#xff08;packet capture&#xff09;&#xff1a;通过工具拦截客户端与服务器交互的数据包。 抓包后可以修改数据包的内容 2.为什么要抓包&…

【洛谷P3366】【模板】最小生成树 解题报告

洛谷P3366 -【模板】最小生成树 题目描述 如题&#xff0c;给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出 orz。 输入格式 第一行包含两个整数 N , M N,M N,M&#xff0c;表示该图共有 N N N 个结点和 M M M 条无向边。 接下…

解决js打开新页面百度网盘显示不存在方法:啊哦,你所访问的页面不存在了。

用js打开新页面open或window.location.href打开百度网盘后都显示&#xff1a;啊哦&#xff0c;你所访问的页面不存在了。 window.open(baidu_url); window.location.href baidu_url;在浏览器上&#xff0c;回车后网盘资源是可以打开的&#xff0c;刷新也是打开的。这是很奇怪…

IPv6知识点整理

IPv6&#xff1a;是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;其地址数量号称可以为全世界的每一粒沙子编上一个地址 。 国…

OkHttp框架源码深度剖析【Android热门框架分析第一弹】

OkHttp介绍 OkHttp是当下Android使用最频繁的网络请求框架&#xff0c;由Square公司开源。Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp&#xff0c;同时现在流行的Retrofit框架底层同样是使用OKHttp的。 源码传送门 优点: 支持Http1、Http…

初学者的TensorFlow 2.0 开发环境安装 -《MCU嵌入式AI开发笔记》(第七集)

MCU嵌入式AI开发笔记 初学者的TensorFlow 2.0 开发环境安装 -《MCU嵌入式AI开发笔记》&#xff08;第七集&#xff09;。抖音、B站、视频号等站点搜索柔贝特三哥&#xff0c;《MCU嵌入式AI开发笔记》视频同步更新&#xff0c;视频详细讲解。 07 初学者的 TensorFlow 2.0 教程 …

【tomcat】tomcat系统架构以及核心启动流程

对于web后端开发工程师来说&#xff0c;tomcat作为一个应用服务器框架本质上就是一个HTTP服务Servlet容器。研究过spring、spring mvc源码的同学应该了解&#xff0c;spring mvc其实就是基于Servlet规范实现的请求的转发路由、转发处理。而Spring和SpringMVC就是通过web.xml文件…

DINO-DETR

DINO-DETR DETR收敛慢的问题1. Contrastive DeNoising Training(对比方法降噪训练)2. Mixed Query Selection(混合查询选择方法对锚点进行初始化)3. Look Forward Twice(两次前向方法)==DINO模型的传播过程,以及部分模块的改进==DETR收敛慢的问题 PnP-DETR(ICCV 2021) 改进了…

同时使用接口文档swagger和knife4j

项目场景&#xff1a; springboot项目中同时使用接口文档swagger和knife4j 问题描述 在实体类中设置了字段必填的属性&#xff0c;在访问接口文档时出现异常 实体类关键代码片段 /*** 部门表 sys_dept*/ public class SysDept extends BaseEntity {private static final lo…

大聪明教你学Java | 深入浅出聊 Kafka

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

2024年6月23日 十二生肖 今日运势

小运播报&#xff1a;2024年6月23日&#xff0c;星期日&#xff0c;农历五月十八 &#xff08;甲辰年庚午月戊午日&#xff09;&#xff0c;法定节假日。今天国际奥林匹克日&#xff0c;坚不可摧的意志&#xff0c;披荆斩棘的豪情&#xff0c;永远值得拥有&#xff01; 红榜生…

YOLOv8改进 | SPPF | 双通道特征处理的池化结构——SPPFCSPC【全网独家】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、…

LLM主流架构和模型

本文参考自https://github.com/HqWu-HITCS/Awesome-Chinese-LLM?tabreadme-ov-file和Huggingface中的ModelCard&#xff08;https://huggingface.co/&#xff09; LLM主要类别架构 LLM本身基于transformer架构。自2017年&#xff0c;attention is all you need诞生起&#x…

P1223 排队接水

题目描述 有 &#x1d45b; 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为 &#x1d447;&#x1d456;&#xff0c;请编程找出这 &#x1d45b; 个人排队的一种顺序&#xff0c;使得 &#x1d45b;个人的平均等待时间最小。 输入格式 第一行为一个整数 &a…

C++ | Leetcode C++题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution { public:int majorityElement(vector<int>& nums) {int candidate -1;int count 0;for (int num : nums) {if (num candidate)count;else if (--count < 0) {candidate num;count 1;}}return candidate;…

根据状态转移写状态机-二段式

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 描述 题目描述&#xff1a; 如图所示为两种状态机中的一种&#xff0c;请根据状态转移图写出代码&#xff0c;状态转移线上的0/0等表示的意思是过程中data/flag的值。 要求&#xff1a; 1、 必须使用对应类型的状…

Django 条件判断模板标签

1&#xff0c;条件判断模板标签 1. 2 {% if %} 标签 {% if variable %}<!-- 如果 variable 为 True&#xff0c;则渲染此处内容 --> {% endif %} 1. 3 {% if %} 与 {% else %} 组合 {% if variable %}<!-- 如果 variable 为 True&#xff0c;则渲染此处内容 -->…

Ubuntu使用 NVIDIA GPU 和 CUDA 设置 LLM 的训练、微调和推理

0.引言 近年来&#xff0c;人工智能领域取得了令人瞩目的进步&#xff0c;其核心是图形处理单元&#xff08;GPU&#xff09;和并行计算平台的强大组合。 大模型如 GPT、BER能够理解和生成具有前所未有的流畅性和连贯性的类人文本。然而&#xff0c;训练这些模型需要大量的数据…

外卖APP开发详解:从同城O2O系统源码开始

近期&#xff0c;从事软件开发的小伙伴们都在讨论外卖APP&#xff0c;热度非常之高&#xff0c;所以小编今天将与大家一同探讨同城O2O系统源码、外卖APP开发。 一、外卖APP开发的前期准备 了解目标用户的需求&#xff0c;分析竞争对手的优劣势&#xff0c;明确自身的市场定位。…