洛谷 3道 函数 题目 题解 (超详细)

news2024/9/22 10:03:30

题目目录:

No.1 B2137 判决素数个数

No.2 B2138 最大质因子序列

No.3 B2140 二进制分类

OK,开始正文!

第一题: B2137 判决素数个数

题目描述

求 X,Y 之间的素数个数(包括 X 和 Y)。

输入格式

两个整数 X 和 Y(1≤X,Y≤1.1×10^6)。

输出格式

输出一个整数,表示 X,Y 之间的素数个数(包括 X 和 Y)。

输入输出样例

输入 #1

1 100

输出 #1

25

思路:

首先,我们需要知道:质数是什么

质数,又称素数,如果一个数除了1和它本身外没有其他因数,那么它就是质数(温馨提示:1不是质数!不然,你分解质因数,随便写几个1都行,就乱套了,而且质数都是2个因数,1只有1个,所以不算)

所以,在循环里面先设一个f=1(假设是质数)只要从2遍历到n-1,如果能整除就f=0(不是质数)

最后如果f=1的话就是质数,计数器++

此外,题目并没有说x大还是y大,所以还得比较一下,如果顺序错误就调换一下顺序,再注意一下对1的判断

既然如此,我们很快就可以写出一份代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int x,y;
    cin >> x >> y;
    int cnt=0;
    if(x>y)
    {
        int t=x;
        x=y;
        y=t;
    }
    for(int i=x;i<=y;i++)
    {
        int f=1;
        for(int j=2;j<i;j++)
        {
            if(i%j==0)
            {
                f=0;
            }
        }
        cnt+=f&&i!=1;
    }
    cout<<cnt;
    return 0;
}

这份代码是不是OK了呢?当你提交这份代码,你将会得到:

这是为什么呢?

这份程序套了两层循环,其中,第一层循环最多可能执行1100000次,而第二层循环最多也是执行1100000次,时间复杂度达到了平方级别,这.....肯定超时呀!

那么,我们就要换一种方法思考:

假设有一个数n,如果它的一个因子在[1,sqrt(n)]范围内,那么和这个因子相对的另一个因子一定在[sqrt(n),n]范围内,这是为什么呢?

设两个因子分别为x,y

如果x,y都在[1,sqrt(n)]范围内,则xy<n,与xy=n不符

如果x,y都在[sqrt(n),n]范围内,则xy>n,与xy=n不符

所以两个因子一定在两个不同的范围里

所以,只要从2搜到sqrt(n),就可以了

另外,搜出了一个因子之后可以直接break退出,不用继续搜下去(假如一个数是一个很大的质数*2,搜出2之后往后搜什么也搜不到,还会浪费时间

AC代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int x,y;
    cin >> x >> y;
    int cnt=0;
    if(x>y)
    {
        int t=x;
        x=y;
        y=t;
    }
    for(int i=x;i<=y;i++)
    {
        int f=1;
        if(i==1)
        {
            continue;
        }
        for(int j=2;j<=i/j;j++)
        {
            if(i%j==0)
            {
                f=0;
                break;
            }
        }
        cnt+=f;
    }
    cout<<cnt;
    return 0;
}

另外,还可以把判断质数过程提取出来,定义一个isPrime函数,这样就不用设一堆乱七八糟的f,直接在函数里判断即可

下面奉上带函数的代码:

#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n)
{
    for(int i=2;i<=n/i;i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return n>=2;
}
int main()
{
    int x,y;
    cin >> x >> y;
    int cnt=0;
    if(x>y)
    {
        int t=x;
        x=y;
        y=t;
    }
    for(int i=x;i<=y;i++)
    {
        cnt+=isPrime(i);
    }
    cout<<cnt;
    return 0;
}

你以为结束了吗?不,这道题还有一种方法:

不知道大家还记不记得小学五年级下册第三单元:因数与倍数里面刚认识质数的时候,是不是有一张表,把2,3,5,7......的倍数划去?对,这就是第3种方法:埃氏筛法,这种方法比上一种快多了(上一种耗时164ms,这一种只要20ms,优势很明显了,数据再大一点比如大到6000000的时候就只能用这个了)

首先,定义一个数组,并假设里面全是质数(就是初始化为0,是合数的到时候改成1)

然后, 把0和1特判一下(改成1)

接着,从2遍历到y(不会超时的),如果是质数(0),就把它的倍数全改成合数(2倍开始!!!到y/i倍!太大要超!

最后统计一下,然后输出即可

AC代码:

#include <bits/stdc++.h>
using namespace std;
bool isPrime[1000005];
int main()
{
    int x,y,cnt=0;
    cin >> x >> y;
    if(x>y)
    {
        int t=x;
        x=y;
        y=t;
    }
    isPrime[0]=isPrime[1]=1;
    for(int i=2;i<=y;i++)
    {
        if(!isPrime[i])
        {
            for(int j=2;j<=y/i;j++)
            {
                isPrime[i*j]=1;
            }
        }
    }
    for(int i=x;i<=y;i++)
    {
        cnt+=!isPrime[i];
    }
    cout<<cnt;
    return 0;
}

(第一题写了2133字)

第二题:B2138 最大质因子序列

题目描述

任意输入两个正整数 m,n(2≤m≤n≤5000),依次输出 m 到 n 之间每个数的最大质因子(包括 m 和 n;如果某个数本身是质数,则输出这个数自身)。

输入格式

一行,包含两个正整数 m 和 n,其间以单个空格间隔。

输出格式

一行,每个整数的最大质因子,以逗号间隔。

输入输出样例

输入 #1

5 10

输出 #1

5,3,7,2,3,5

思路:

既然是质因子,那就先打一个上面的判断质数函数,然后从n遍历到2,如果是质数而且是因数就输出然后跳出循环(我定义的是函数,一个return就行啦)

AC代码:

#include <bits/stdc++.h>
using namespace std;
bool flag;
bool isPrime(int n)
{
    for(int i=2;i<=n/i;i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return n>=2;
}
void sss(int n)
{
    for(int i=n;i>=2;i--)
    {
        if(isPrime(i)&&n%i==0)
        {
            if(!flag)
            {
                cout<<i;
                flag=true;
                return;
            }
            else
            {
                cout<<","<<i;
                return;
            }
        }
    }
}
int main()
{
    int m,n;
    cin >> m >> n;
    for(int i=m;i<=n;i++)
    {
        sss(i);
    }
    return 0;
}

第三题:B2140 二进制分类

题目描述

若将一个正整数化为二进制数,在此二进制数中,我们将数字 1的个数多于数字 0 的个数的这类二进制数称为 A 类数,否则就称其为 B 类数。

例如:

(13)10=(1101)2​,其中 1 的个数为 3,0 的个数为 1,则称此数为 A 类数;

(10)10=(1010)2​,其中 1 的个数为 2,0 的个数也为 2,称此数为 B 类数;

(24)10=(11000)2​,其中 1 的个数为 2,0 的个数为 3,则称此数为 B 类数;

程序要求:求出 1~n 之中(1≤n≤1000),全部 A,B 两类数的个数。

输入格式

输入 n。

输出格式

一行,包含两个整数,分别是 A 类数和 B 类数的个数,中间用单个空格隔开。

输入输出样例

输入 #1

7

输出 #1

5 2

思路:

定义一个函数判断是A类数还是B类数,统计个数,然后输出

AC代码:

#include <bits/stdc++.h>
using namespace std;
int A,B;
void sss(int n)
{
    int c1=0,c2=0;
    do
    {
        n%2?c1++:c2++;
        n/=2;
    }while(n);
    if(c1>c2)
    {
        A++;
    }
    else
    {
        B++;
    }
}
int main()
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        sss(i);
    }
    cout<<A<<" "<<B;
    return 0;
}

这篇博客就到这里啦,如果觉得好的话,就请点个赞或者点个收藏,关注吧!您的支持是我创作最大的动力!我写的很辛苦,就是为了你们的支持呀!(无辜)(眨眼)(o´・ェ・`o)本篇博客只有3道题,却有3380字!特别是第一道,共2133字呢!后面是因为我来不及了,只能这样了

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

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

相关文章

LB-8100A 推拉力测试机精密推拉力试验机

LB-8100A 多功能推拉力测试机广泛应于与 LED 封装测试、IC 半导体封 装测试、TO 封装测试、IGBT 功率模块封装测试、光电子元器件封装测试、汽 车领域、航天航空领域、军工产品测试、研究机构的测试及各类院校的测试 研究等应用。 多功能推拉力测试机精密推拉力试验机 *设备硬件…

地热模拟软件opengeosys-OGS安装和学习1

1.下载地址 官网&#xff1a;https://www.opengeosys.org/ 界面Gina&#xff1a;https://discourse.opengeosys.org/t/gina-version-3-24/175 https://teambeam.bgr.de/my/drive/folder/68&#xff08;注意下载压缩包&#xff0c;有些注册表需要处理&#xff09; 2.处理 下…

视频汇聚平台智能边缘分析一体机分析平台摄像头异常位移算法识别检测

智能边缘分析一体机在摄像头异常位移检测方面扮演着关键角色&#xff0c;它利用先进的图像处理技术和机器学习算法来实时监测摄像头状态&#xff0c;判断是否发生了非预期的位移。下面是智能边缘分析一体机如何检测摄像头异常位移的详细步骤&#xff1a; 1. 图像帧对比&#x…

内部排序(二路归并、基数、计数)

【内部排序&#xff08;插入、交换、选择&#xff09;】 一、二路归并排序 1. 算法思想与实现步骤 1&#xff09;算法思想&#xff1a; 二路归并排序是一种分治算法。它将待排序的序列分为两个子序列&#xff0c;分别对这两个子序列进行排序&#xff0c;然后将两个已排序的子…

安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统是由安美世纪(北京)科技有限公司开发的一套专为酒店设计的宽带管理系统。该系统旨在提升酒店宽带服务的运营效率和安全性&#xff0c;为酒店客人提供稳定、高速、便捷的上网体验。 0x02 漏洞概述 安美数字酒店宽带运营系统 weather.php …

【Linux】快速入门系列(四) —— Linux实用操作

Linux实用操作 前言&#xff1a;先换个阿里的源一、各类小技巧 — 快捷键&#xff08;一&#xff09;强制停止 CtrlC&#xff08;二&#xff09;退出或登出 CtrlD&#xff08;三&#xff09;历史命令搜索的三种方式&#xff08;四&#xff09;光标移动快捷键&#xff08;五&…

无人机之机架布局篇

一、“十”字型 “十”字布局适合刚接触无人机的初学者&#xff0c;是起初最先发展的布局。 优点&#xff1a;控制简单&#xff0c;首尾明确&#xff0c;俯仰和横滚运动仅需改变一对电机的转速。 缺点&#xff1a;机体前向视角易被螺旋桨遮挡&#xff0c;灵活性有所不足&…

DHCP服务(服务名dhcpd,端口UDP /67和UDP/68)

目录 前言 配置文件 DHCP服务器的配置 下载安装DHCP服务 编辑配置文件 重启服务 客户端测试 配置客户端网卡 重启网卡 前言 DHCP动态主机配置协议是一种网络协议&#xff0c;提供了动态配置IP地址的功能&#xff0c;允许服务器自动为网络上的设备分配IP地址和其他网络…

自动化测试面试常用题库

自动化面试题记录整理&#xff08;部分答案自己整理&#xff09; selenium中如何判断元素是否存在&#xff1f; 没有提供原生的方法判断元素是否存在&#xff0c;一般我们可以通过定位元素异常捕获的方式判断selenium中hidden或者是display &#xff1d; none的元素是否可以定…

8080端口被占怎么处理?

一、Windows系统 1、 按住WinR输入CMD打开命令行窗口 2、运行以下命令来查看占用端口 8080 的程序的 PID&#xff08;进程标识符&#xff09;&#xff0c;可以看到PID是12040 netstat -ano | findstr 8080 3、 运行以下命令来终止占用端口 8080 的程序&#xff1a; taskkill /p…

精彩回顾 | 风丘科技亮相2024名古屋汽车工程博览会

2024年7月17日-19日&#xff0c;风丘科技联合德国IPETRONIK亮相日本名古屋汽车工程博览会。该展会面向汽车行业不同应用场景&#xff0c;包括新的eAxle、FCEV、ADAS、测试测量系统和ECU测试等相关技术&#xff0c;是一个专为活跃在汽车行业前线的工程师和研究人员举办的汽车技术…

腾讯云 AI代码助手 | 尽享 AI时代下的程序员福利

腾讯云 AI代码助手 | 尽享 AI时代下的程序员福利 前言腾讯云AI代码助手智能补全代码信息&#xff08;代码补全&#xff09;精准修复错误代码&#xff08;代码优化&#xff09;清晰解释既有代码&#xff08;解释代码&#xff09;按需生成单元测试&#xff08;生成单元测试&#…

NoSQL 之Redis集群模式

目录 案例概述 redis工作模式 主从模式 哨兵模式 redis cluster模式 Redis集群介绍 Redis集群的优势 Redis集群的实现方法 Redis-Cluster数据分片 Redis-Cluster的主从复制模型 Redis集群部署 案例部署 安装redis 检查redis的状态 修改配置文件 重启启动redis服…

第二证券:A股三大指数震荡调整 环保板块强势拉升

环保板块迎来重磅方针 昨日&#xff0c;环保板块强势拉升&#xff0c;永清环保20%涨停&#xff0c;东江环保、启迪环境、雪迪龙等多股涨停。 音讯面上&#xff0c;中共中央、国务院近来印发《关于加快经济社会开展全面绿色转型的定见》。定见布置加快形成节省资源和保护环境的…

WordPress原创插件:Keyword-ranking-seo 1.0 关键词排名插件 有利于seo

WordPress原创插件&#xff1a;Keyword-ranking-seo 1.0 关键词排名插件 有利于seo 当用户访问网站时&#xff0c;该链接会随机选择一个关键词&#xff0c;并使用选定的搜索引擎进行搜索。 插件下载链接 https://download.csdn.net/download/huayula/89632792

备战秋招60天算法挑战,Day17

题目链接&#xff1a; https://leetcode.cn/problems/valid-anagram/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1db421J7qK/ LeetCode 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意…

同城搭子社交系统开发同城搭子群活动APP圈子动态小程序

引言 随着互联网技术的飞速发展&#xff0c;同城搭子社交系统作为一种新兴的社交模式&#xff0c;正逐渐在市场中占据一席之地。该系统通过搭子群活动和圈子动态等功能&#xff0c;为用户提供了一种高效、精准的社交体验。本文将从市场前景、使用人群、盈利模式以及运营推广等…

azure 上如何创建 Kubernetes 集群?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

SO_REUSEADDR 和 SO_REUSEPORT 的区别 / Linux TCP SO_REUSEPORT — 使用和实现 ……

注&#xff1a;机翻&#xff0c;未校。 Difference Between SO_REUSEADDR and SO_REUSEPORT Last Updated : 05 Feb, 2023 Processes use sockets as endpoints of a two-way channel to transfer data. The socket options SO_REUSEADDR and SO_REUSEPORT have different ma…

血缘系统 datahub + Sqllineage

1.说明 业界比较主流的数据血缘系统&#xff0c;目前还没能达到与调度系统耦合&#xff0c;最大难点在于代码解析。当某张表下游太多时(特别是维度表)&#xff0c;展示也失去了意义&#xff0c;所以多用于排查某张应用表的上游从哪里开。使用方一般为对数仓表结构不太熟悉的业务…