算法回忆录(1)

news2025/1/4 3:40:09

1.编程求1*2*3*4*……*n的末尾有多少个0。

#include <stdio.h>

// 计算 n! 中末尾的0的个数
int count_zeros_in_factorial(int n) {
    int count = 0;
    for (int i = 5; n / i >= 1; i *= 5) {
        count += n / i;
    }
    return count;
}

int main() {
    int n;
    printf("请输入一个整数 n:");
    scanf("%d", &n);
    
    int zeros_count = count_zeros_in_factorial(n);
    printf("%d! 的末尾有 %d 个0\n", n, zeros_count);
    
    return 0;
}

解释和步骤:

  1. 函数 count_zeros_in_factorial: 这个函数用于计算 n!n!n! 中末尾的0的个数。通过一个循环,从 i=5i = 5i=5 开始,每次乘以5,累加 n / i 的值到 count 中,直到 n / i 的值小于1为止。这样就计算了所有能被 5,25,125,…5, 25, 125, \ldots5,25,125,… 整除的数的个数。

  2. 主函数 main: 在 main 函数中,首先获取用户输入的整数 n,然后调用 count_zeros_in_factorial 函数计算 n!n!n! 的末尾0的个数,并输出结果。

运行结果: 

 

2.请输入一个50至100之间的整数n,求解n!。

#include <stdio.h>

#define MAX_DIGITS 500 // 定义最大位数为500,足以容纳100的阶乘

// 函数声明:计算大整数阶乘
void factorial(int n, int result[], int *result_size);

// 打印大整数数组
void printBigNumber(int result[], int result_size) {
    for (int i = result_size - 1; i >= 0; i--) {
        printf("%d", result[i]);
    }
    printf("\n");
}

// 计算大整数阶乘
void factorial(int n, int result[], int *result_size) {
    result[0] = 1; // 初始结果为1
    *result_size = 1; // 初始结果位数为1
    
    // 计算 n!,从2开始乘到n
    for (int i = 2; i <= n; i++) {
        int carry = 0; // 进位
        for (int j = 0; j < *result_size; j++) {
            int product = result[j] * i + carry;
            result[j] = product % 10; // 取个位数作为当前位
            carry = product / 10; // 进位数
        }
        
        // 处理剩余的进位
        while (carry > 0) {
            result[*result_size] = carry % 10;
            carry = carry / 10;
            (*result_size)++;
        }
    }
}

int main() {
    int n;
    printf("请输入一个50至100之间的整数 n:");
    scanf("%d", &n);
    
    if (n < 50 || n > 100) {
        printf("输入的整数不在50至100之间。\n");
        return 1;
    }
    
    // 创建数组来存储结果
    int result[MAX_DIGITS];
    int result_size; // 存储结果的位数
    
    // 计算阶乘
    factorial(n, result, &result_size);
    
    // 输出结果
    printf("%d! = ", n);
    printBigNumber(result, result_size);
    
    return 0;
}

解释和步骤:

  1. 数组和常量定义

    • MAX_DIGITS 定义了数组的最大长度,足够存储50至100之间任意整数的阶乘结果。
  2. 函数 factorial

    • 接受一个整数 n 和一个数组 result 来存储阶乘的结果,以及一个指针 result_size 来记录结果的位数。
    • 初始时,将结果设置为1,并且结果位数为1。
    • 使用两层循环来模拟手工乘法的过程,每次将当前乘积的个位数存入数组中,并记录进位数。
    • 每次乘完一轮,检查是否有剩余的进位需要处理,直到没有进位为止。
  3. 主函数 main

    • 提示用户输入一个50至100之间的整数 n
    • 检查输入是否在有效范围内,如果不在范围内则输出错误信息并结束程序。
    • 创建一个足够大的数组 result 来存储阶乘的结果。
    • 调用 factorial 函数计算阶乘,并将结果存储在 result 数组中。
    • 调用 printBigNumber 函数打印计算出的阶乘结果。

运行结果: 

3. 有A、B、C、D、E 5个人为某次竞赛的前五名,他们在名次公布前猜名次。

A说:B得第三名,C得第五名。

B说:D得第二名,E得第四名。

C说:B得第一名,E得第四名。

D说:C得第一名,B得第二名。

E说:D得第二名,A得第三名。

结果每个人都猜对了一半,实际名次是什么?

#include <stdio.h>

int main() {
    int A, B, C, D, E; // A, B, C, D, E 分别代表ABCDE五人的名次
    
    // 穷举ABCDE的排名,满足每个人猜对一半的条件
    for (A = 1; A <= 5; ++A) {
        for (B = 1; B <= 5; ++B) {
            if (B == A) continue; // B不能和A同名次
            for (C = 1; C <= 5; ++C) {
                if (C == A || C == B) continue; // C不能和A或B同名次
                for (D = 1; D <= 5; ++D) {
                    if (D == A || D == B || D == C) continue; // D不能和A、B或C同名次
                    for (E = 1; E <= 5; ++E) {
                        if (E == A || E == B || E == C || E == D) continue; // E不能和A、B、C或D同名次
                        
                        // 检查每个人的猜测是否正确
                        int correct_count = 0;
                        
                        if (B == 3 && C == 5) correct_count++; // A猜测
                        if (D == 2 && E == 4) correct_count++; // B猜测
                        if (B == 1 && E == 4) correct_count++; // C猜测
                        if (C == 1 && B == 2) correct_count++; // D猜测
                        if (D == 2 && A == 3) correct_count++; // E猜测
                        
                        // 判断是否满足每个人猜对一半的条件
                        if (correct_count == 2) {
                            printf("实际名次为:A=%d, B=%d, C=%d, D=%d, E=%d\n", A, B, C, D, E);
                            return 0;
                        }
                    }
                }
            }
        }
    }
    
    return 0;
}

 解释和步骤:

  1. 穷举法:通过嵌套的循环遍历ABCDE五人可能的排名组合,从1到5,确保每个人的名次都不同。

  2. 条件检查:在每个排名组合中,检查每个人的猜测是否正确,根据题目提供的猜测条件进行判断。

  3. 正确答案判定:当找到满足每个人猜对一半条件的排名组合时,即输出实际名次。

运行结果:  

4.百马百担问题:有100匹马,驮100担货。大马驮3担,中马驮2担,两匹小马驮1担,问大、中、小马各多少?

#include <stdio.h>

int main() {
    int x, y, z; // x, y, z 分别表示大马、中马、小马的数量
    
    // 穷举大马、中马、小马的数量,满足总数为100匹马,总载重为100担
    for (x = 0; x <= 100; ++x) {
        for (y = 0; y <= 100 - x; ++y) {
            z = (100 - 3*x - 2*y) * 2; // 计算小马的数量
            
            // 检查是否满足每种马的驮载条件
            if (z >= 0 && z % 2 == 0&&x+y+z==100) {
                printf("大马:%d 匹,中马:%d 匹,小马:%d 匹\n", x, y, z);
            }
        }
    }
    
    return 0;
}

 解释和步骤:

  1. 穷举法:通过嵌套的循环遍历大、中、小马的数量可能组合,确保它们的总数为100匹马,同时总载重为100担货物。

  2. 条件检查:在每个马匹数量组合中,计算总载重是否为100担。如果满足条件,则输出对应的大马、中马、小马的数量。

  3. 输出结果:程序将打印所有满足条件的组合,即大、中、小马各自的数量,使得总数为100匹马,总载重为100担货物。

运行结果:  

5. 输入整数N、K以及长度为N的无序序列,找到第K小数并输出。第一行输入N和K,第二行输入长度为N的整数数组。

#include <stdio.h>

// 交换函数,用于交换数组中两个元素的位置
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 分割函数,用于将数组按照基准数分成两部分,并返回基准数的位置
int partition(int arr[], int left, int right) {
    int pivot = arr[right]; // 选择最右边的元素作为基准数
    int i = left - 1; // i指向小于基准数的区域的最后一个元素
    
    for (int j = left; j < right; ++j) {
        if (arr[j] <= pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    
    swap(&arr[i + 1], &arr[right]); // 将基准数放到正确的位置上
    return i + 1; // 返回基准数的位置
}

// 寻找第K小的数的函数
int findKthSmallest(int arr[], int left, int right, int k) {
    if (k > 0 && k <= right - left + 1) {
        int pivotIndex = partition(arr, left, right);
        
        if (pivotIndex - left == k - 1)
            return arr[pivotIndex];
        
        if (pivotIndex - left > k - 1)
            return findKthSmallest(arr, left, pivotIndex - 1, k);
        
        return findKthSmallest(arr, pivotIndex + 1, right, k - (pivotIndex - left + 1));
    }
    
    return -1; // 如果k超出数组长度的范围,返回-1表示未找到
}

int main() {
    int N, K;
    printf("请输入整数 N 和 K:");
    scanf("%d %d", &N, &K);
    
    int arr[N];
    printf("请输入长度为 N 的整数数组:");
    for (int i = 0; i < N; ++i) {
        scanf("%d", &arr[i]);
    }
    
    int result = findKthSmallest(arr, 0, N - 1, K);
    if (result != -1)
        printf("第 %d 小的数是:%d\n", K, result);
    else
        printf("输入的 K 超出数组长度的范围。\n");
    
    return 0;
}

解释和步骤:

  1. swap函数:用于交换数组中两个元素的位置。

  2. partition函数:实现分割函数,选择最右边的元素作为基准数(pivot),将数组分成两部分,小于等于基准数的放在左边,大于基准数的放在右边,并返回基准数的位置。

  3. findKthSmallest函数:递归地寻找第K小的数。在每次调用中,根据partition函数返回的基准数的位置,判断应该继续在左侧还是右侧进行搜索,直到找到第K小的数为止。

  4. 主函数main

    • 输入N和K。
    • 输入长度为N的整数数组。
    • 调用findKthSmallest函数找到第K小的数,并输出结果。

运行结果:  

 结语  

最暗的夜

才会看见最美的星光

人生亦是如此

!!!

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

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

相关文章

代码随想录day34 || 62不同路径 63不同路径2 343整数拆分

动归5步法 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2&#xff0c;确定递推公式 3&#xff0c;dp数组如何初始化 4&#xff0c;确定遍历顺序 5&#xff0c;举例推导dp数组 62不同路径 力扣题目链接 题目描述&#xff1a; 一个机器人…

免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue图书(图书借阅)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue图书(图书借阅)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文阐述了一套先进的图书管理系…

分享一个基于Node.js和Vue的游戏点单陪玩系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

MQ面试篇

目录 传送门前言一、MQ优缺点二、MQ消息重复问题处理&#xff08;精品&#xff09;三、保证MQ消息不丢失四 、MQ百万消息持续积压问题五、如果保证MQ的高可用 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringB…

山东青岛高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

青岛高校大学智能制造实验室作为高校科研和人才培养的重要基地&#xff0c;一直致力于推动智能制造技术的研发和应用。为了提升实验室在智能制造领域的教学、科研和产业合作能力&#xff0c;实验室决定建设数字孪生可视化系统平台。 智能制造数字孪生项目旨在通过搭建一个全面…

C语言实现希尔排序和堆排序

目录 1.希尔排序 1.1基本思想 1.2希尔排序的特性总结 1.3希尔排序算法的实现 2.堆排序 2.1基本思想 2.2堆排序的特性总结 2.3堆排序算法的实现 1.希尔排序 1.1基本思想 希尔排序法的基本思想是&#xff1a;先选定一个整数(gap)&#xff0c;把待排序文件中所有记录分成…

自定义微信小程序源码系统 带网站的源代码包以及搭建部署教程

系统概述 自定义微信小程序源码系统是一套完整的解决方案&#xff0c;包含了微信小程序的源代码以及配套的网站源代码包。它为开发者提供了一个可定制、可扩展的开发平台&#xff0c;让开发者能够根据自己的需求和创意&#xff0c;快速构建出具有独特风格和功能的微信小程序。…

微力同步如何安装使用并使用内网穿透配置公网地址远程访问

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 内网穿透工具安装 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其广…

CodeWave简介

CodeWave是网易自主研发的领先低代码平台&#xff0c;可快速搭建公司官网、项目管理、OA等各种企业信息化系统&#xff0c;助力企业数字化提质增效。产品特点&#xff1a;低门槛&#xff08;降低软件开发门槛&#xff0c;赋能非专业技术人员专职从事软件开发工作&#xff09;、…

要想赚钱,AI模型该大该小?贾扬清:论AI模型经济学的技巧

卖模型就像感恩节卖火鸡&#xff0c;快才能赚钱。 最近的AI社区&#xff0c;关于模型规模的讨论有些活跃。 一方面&#xff0c;此前在大模型开发奉为“圣经”的Scaling Law&#xff0c;似乎正在褪去光环。去年大家还在猜测GPT-5的规模“可能会大到想不到”&#xff0c;现在这…

2024华数杯C题解题思路及详细建模步骤分享+双语言代码

2024“华数杯”数模竞赛已经开赛啦&#xff0c;这次给大家带来的是今年华数杯C题解题思路&#xff0c;内容由我们团队的众多国奖学长学姐给大家出具高质量的解题思路&#xff0c;参考代码等&#xff0c;希望能助大家一臂之力。 问题1: 请问352 个城市中所有35200 个景点评分的最…

【Nuxt】约定式路由和 NuxtLink

约定式路由 手动创建&#xff1a; 或者还可以使用终端创建页面&#xff1a;nuxi-add-page npx nuxi add page about — about.vue npx nuxi add page about/index — about/index.vue <NuxtLink to"/"><button>Home</button></NuxtLink><…

25集 ESP32 C3 AI chat聊天工程代码流程-《MCU嵌入式AI开发笔记》

25集 ESP32 C3 AI chat聊天工程代码流程-《MCU嵌入式AI开发笔记》 我们打开Ai chat工程&#xff0c;用vscode。 main.c里面&#xff0c;重点看一下app_main函数。 Created with Raphal 2.3.0 开始 nvs_flash_init audio_hal_ctrl_codec audio init display init &#xff08…

AUTOSAR之AUTOSAR OS(下)

前言&#xff1a;在上篇中&#xff0c;我们主要描述了OSEK OS的相关内容以及AUTOSAR OS的OS Application对象的一些内容&#xff0c;包括Counter&#xff0c;Alarm&#xff0c;Enent&#xff0c;ISR&#xff0c;Task&#xff0c;Schudule Table等&#xff0c;本篇文章中&#x…

element-plus 菜单组件 index属性如何正确赋值?

element-plus 菜单组件 index属性如果直接填写字符串&#xff0c;就会报如下的错误 正确写法与错误写法 报错解释&#xff1a;Error parsing JavaScript expression: Unterminated regular expression. (1:2) 这个错误表明你在解析一个JavaScript表达式时遇到了一个未正确结束…

【人工智能专栏】 PCA Decomposition

PCA Decomposition 算法 去除平均值 。计算协方差矩阵 。计算协方差矩阵的特征值和特征向量 。将特征值排序 保留前N个最大的特征值对应的特征向量 。将原始特征转换到上面得到的N个特征向量构建的新空间中(最后两步,实现了特征压缩)。解释 为什么样本在“协方差矩阵C的最大…

元太电磁膜SUDE-10S19MI-01X驱动适配

屏规格书&#xff1a; dts配置&#xff1a; 首先要确保CONFIG_I2C_HID宏打开&#xff0c;i2c-hid-core.c 文件才能编译进去代码。规格书vendor product 分别为0x2d1f 和0x0165 来区别&#xff0c;不至于影响到整体的hid其他设备。 i2c-hid-dev10 { compatible "hid-…

WordPress主题 CeoMax-Pro_v7.6总裁主题资源下载类主题

CeoNova-Pro 主题是一款轻量级、且简洁大气、产品官网类主题&#xff0c;定位于高端产品官网、同时包含了知识付费、定制服务、问答社区、论坛交流、网址导航、以及付费产品购买下载等全方位覆盖。

数据库扩展新篇章:主流分库分表中间件全解析

摘要&#xff1a; 随着企业数据量的激增&#xff0c;传统的单体数据库架构已经无法满足日益增长的性能需求和数据管理复杂性。分库分表技术作为解决这一问题的有效手段&#xff0c;通过将数据水平或垂直地分散到多个数据库中&#xff0c;提高了系统的扩展性和处理能力。本文将详…

JAVA答题系统练习模拟考试平台支持H 5小程序APP公众号源码

&#x1f4dd;“答题系统练习模拟考试平台”——你的备考神器来啦&#xff01;&#x1f393; &#x1f4da;【精准题库&#xff0c;覆盖全面知识点】 备考路上&#xff0c;最怕的就是题目不够全、不够新&#xff01;“答题系统练习模拟考试平台”汇聚了海量精编题库&#xff…