C语言入门算法——选数

题目描述:

已知 n 个整数 x1​,x2​,⋯,xn​,以及 1 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4个整数分别为3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29。

输入格式

第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)。

第二行 n 个整数,分别为 x1​,x2​,⋯,xn​(1≤xi​≤5×10^6)。

输出格式

输出一个整数,表示种类数。

输入输出样例

输入 #1

4 3
3 7 12 19

输出 #1

1

说明/提示

【题目来源】

P1036 [NOIP2002 普及组] 选数

思路及部分代码:

1. 判断素数

        素数:只能被1和自己整除的数。

int prime_number(long long int n){
    if(n == 2 || n == 1) return 1;
    for(long long int i = 2; i<=(n/2)+1; i++){
        if(n % i == 0) return 0;
    }
    return 1;
}

2. 递归函数


void scan(int ni, int n, int k, long long int num){
    if(k <= 0){
        cnt = cnt + prime_number(num);
        return;
    }
    for(int i = ni;i < n;i++){
        scan(i+1,n,k-1,num + number[i]);
    }
    return;
}

总代码:

#include <stdio.h>

long long int number[20] = {0};

int cnt = 0;

int prime_number(long long int n){
    if(n == 2 || n == 1) return 1;
    for(long long int i = 2; i<=(n/2)+1; i++){
        if(n % i == 0) return 0;
    }
    return 1;
}

void scan(int ni, int n, int k, long long int num){
    if(k <= 0){
        cnt = cnt + prime_number(num);
        return;
    }
    for(int i = ni;i < n;i++){
        scan(i+1,n,k-1,num + number[i]);
    }
    return;
}

int main (){
    int n,k;
    scanf("%d %d",&n, &k);

    for(int i=0;i < n; i ++){
        scanf("%lld",&number[i]);
    }

    scan(0,n,k,0);
    printf("%d",cnt);
    return 0;
}   

总结:

        这段代码实现了一个递归函数 scan,用于计算一组数中满足特定条件的子集的数量。其中,函数 prime_number 用于判断一个数是否为质数。然后在 main 函数中读取输入,调用 scan 函数并输出结果。

不足之处:

  1. 缺少输入验证: 代码中没有对输入进行充分的验证,比如输入的 n 和 k 是否在合理范围内,以及是否满足特定条件。这可能导致程序在某些情况下出现错误。

  2. 全局变量的使用: 全局变量 cnt 和 number 可能会导致代码可读性和可维护性下降,尤其在大型程序中更容易引起混乱。

  3. 递归深度限制: 递归函数 scan 可能存在递归深度过深的风险,如果 n 过大或者 k 过大,可能导致栈溢出。

  4. 质数判断效率: 质数判断函数 prime_number 的效率可能不高,因为它遍历了大约一半的数来判断一个数是否为质数,可以考虑优化算法。

改进建议:

  1. 输入验证: 在读取输入时,应该验证输入的有效性,确保 n 和 k 符合要求,避免出现不必要的错误。

  2. 避免全局变量: 尽量避免使用全局变量,可以将 cnt 和 number 变量传递给函数,或者将它们定义在 main 函数内部。

  3. 优化递归: 考虑优化递归函数,避免出现过深的递归调用。可以尝试使用迭代或其他方法替代递归。

  4. 质数判断优化: 优化质数判断函数,可以只遍历到 sqrt(n) 范围内的数进行判断,减少不必要的计算。

  5. 代码注释和命名: 添加适当的注释来解释代码的功能和逻辑,同时使用更具描述性的变量和函数命名,提高代码的可读性。

  6. 错误处理: 在可能出现错误的地方添加适当的错误处理机制,以便程序在出现异常情况时能够正确处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AIGC算法2:LLM的复读机问题

1. 什么是LLM的复读机问题 字符级别重复&#xff0c;指大模型针对一个字或一个词重复不断的生成例如在电商翻译场景上&#xff0c;会出现“steckdose steckdose steckdose steckdose steckdose steckdose steckdose steckdose…”&#xff1b;语句级别重复&#xff0c;大模型针…

不容错过的 IntelliJ IDEA 插件 Top 10

虽然 IntelliJ IDEA 功能齐全&#xff0c;您仍然可以增添一些个性化的设置。 JetBrains Marketplace 上有着大量实用插件&#xff0c;可以满足您个人或企业的特定需求。 内容库非常庞大&#xff0c;可能会让人眼花缭乱。 在这篇博文中&#xff0c;我们将分享最近和一直以来最受…

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中&#xff0c;没有实现windows平台视频播放的功能&#xff0c;需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网&#xff1a;网址 下载完成后&#x…

如何配置Postgres的自动扩展功能以应对数据增长

文章目录 解决方案1. 表空间管理2. 分区表3. 自动扩展配置4. 监控和告警5. 使用外部工具和服务 示例代码示例1&#xff1a;创建表空间示例2&#xff1a;创建分区表示例3&#xff1a;调整配置参数示例4&#xff1a;使用监控和告警工具 总结 在PostgreSQL中&#xff0c;随着数据的…

Spring Boot:Web应用开发之登录与退出的实现

Spring Boot 前言实现登录功能配置拦截器 实现退出功能 前言 登录与退出功能作为 Web 应用中的基础且重要的组成部分&#xff0c;直接关系到用户的安全和隐私保护。通过实现登录与退出功能&#xff0c;可以对用户的身份进行验证和授权&#xff0c;确保只有合法的用户才能访问特…

吃鸡游戏msvcp140.dll丢失的解决方法

msvcp140.dll 是一个与 Microsoft Visual C Redistributable 相关的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;是 Windows 操作系统中众多应用程序正常运行所必需的关键组件之一。以下是对 msvcp140.dll 文件的总体介绍和msvcp140.dll丢失的多个解决方案分享。 *…

Java项目实现Excel导出(Hutool)

官网&#xff1a; Excel生成-ExcelWriter (hutool.cn) 1.使用Hutool工具实现Excel导出&#xff08;.xlsx格式&#xff09; 业务场景&#xff1a; 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 第零步&#xff1a;导入依赖 <!-…

NPL预训练模型-GPT-3

简介及特点 GPT-3是一个由OpenAI开发的自然语言处理&#xff08;NLP&#xff09;预训练模型&#xff0c;它是生成式预训练变换器&#xff08;Generative Pretrained Transformer&#xff09;系列的第三代模型。GPT-3以其巨大的规模和强大的语言处理能力而闻名&#xff0c;具有…

快速上手Linux核心命令

Linux 的重要性不用我多说了吧&#xff0c;大多数互联网公司&#xff0c;服务器都是采用的Linux操作系统 Linux是一个主要通过命令行来进行管理的操作系统。 只有熟练掌握Linux核心命令&#xff0c;在使用起来我们才会得心应手 这里给大家整理了Linux一些核心命令&#xff0…

游戏、app抓包

文章目录 协议app抓包游戏抓包 协议 在抓包之前&#xff0c;首先我们要对每个程序使用什么协议有个大致的了解&#xff0c;比如网页这种就是走的http协议。 在一些app中我们通过发送一个请求&#xff0c;然后服务器接受&#xff0c;响应&#xff0c;返回一个数据包&#xff0c…

数字人解决方案——EMAGE面部加肢体动画实现从音频生成数字人表情与动作

概述 AI数字人面部与肢体的驱动算法是数字人研发中至关重要的一环&#xff0c;它能够有效降低VR Chat、虚拟直播和游戏NPC等应用场景中的成本。随着技术的发展&#xff0c;基于语音的面部、肢体和手部动作生成模型已经逐步成熟并得到广泛应用。然而&#xff0c;当尝试将这些独…

反激电源——TL431及光耦反馈电路计算(不涉及环路补偿)

一、TL431及光耦反馈电路 TL431以及光耦电路是反激的副边反馈类型电路中的常见应用。 其反馈工作原理为&#xff1a;当副边的输出电压升高时&#xff0c;TL431的REF点采样电压也会升高&#xff0c;使得TL431的导通量增加&#xff0c;同时光耦内部的发光二极管流过的电流也增大&…

C++11 数据结构3 线性表的循环链式存储,实现,测试

上一节课&#xff0c;我们学了线性表 单向存储结构&#xff08;也就是单链表&#xff09;&#xff0c;这个是企业常用的技术&#xff0c;且是后面各种的基本&#xff0c;一定要牢牢掌握&#xff0c;如果没有掌握&#xff0c;下面的课程会云里雾里。 一 &#xff0c;循环链表 1…

遥测终端赋能水库泄洪监测预警,筑牢度汛安全防线!

4月10日&#xff0c;水利部召开水库安全度汛视频会议。会议要求着力强化水库防洪“四预”措施&#xff0c;加快构建雨水情监测预报“三道防线”&#xff0c;完善预警信息发布机制&#xff0c;推进数字孪生水利工程建设&#xff0c;为科学调度指挥决策提供支持。强调坚决牢牢守住…

基于3D点云的散货库存体积计算

首先&#xff0c;你需要散货库存的点云。 我将使用 IntelRealSense 捕获的散货库存的 .ply文件。 然而&#xff0c;任何其他产生点云的成像技术都同样有效。 点击这里查看本教程的 Github 上的代码。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - …

二叉树的中序遍历 - LeetCode 热题 36

大家好&#xff01;我是曾续缘&#x1f603; 今天是《LeetCode 热题 100》系列 发车第 36 天 二叉树第 1 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输…

爬楼梯(c)

文章目录 描述分析思路关键代码运行结果 描述 给定一个整数数组 cost &#xff0c;其中 cost[i]是从楼梯第i 个台阶向上爬需要支付的费用&#xff0c;下标从0开始。-旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶 要求&#xff1a;请你计算并返回达到楼梯顶部的…

4.17

while(1) { HAL_ADC_Start(&hadc); adcVal HAL_ADC_GetValue(&hadc); TIM3->CCR3 adcVal-2000; } 1.总结串口的发送和接收功能使用到的函数 HAL_UART_Transmit_DMA(&huart1,"hello world",strlen("hello world")); HAL_UART_Tr…

Linux:如何删除指定时间之前修改的文件?

1、与文件有关的时间 在说明如何删除符合这种要求的文件之前&#xff0c;先来看看与文件有关的有哪些时间 简名全名中文名含义atimeaccess time访问时间文件中的数据最后被访问的时间mtimemodify time修改时间文件中的数据最后被修改的时间ctime change time变化时间文件的元…

JavaSE高阶篇-IO流

第一部分 file类 1&#xff09;File类 计算机常识: 1.名字为".jpg"的一定是图片吗? 不一定,有可能是文件夹 2.什么叫做文本文档: 用记事本打开,人能看懂的文件 比如:.txt .html .css等 .doc -> 不是 …
最新文章