C++011-C++循环+枚举

news/2024/5/15 11:21:51/文章来源:https://blog.csdn.net/m0_38139250/article/details/129107242

文章目录

  • C++011-C++循环+枚举
    • 枚举
      • 枚举思想
      • 枚举举例
      • 题目描述 统计因数
      • 题目描述 质数判定
        • 错误方法一:
        • 优化方法1: 用break实现优化
        • 优化方法2: sqrt(n)
      • 题目描述 水仙花数
      • 题目描述 7744问题
        • 实现方法1
        • 优化方法2
      • 题目描述 余数相同问题
      • 题目描述 特殊自然数
      • 总结
      • 作业
    • 在线练习:
    • 总结

C++011-C++循环+枚举

在这里插入图片描述

在线练习:
http://noi.openjudge.cn/
https://www.luogu.com.cn/

枚举

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合!。
在这里插入图片描述

在这里插入图片描述

枚举思想

枚举:列出某些有穷序列集的所有成员,或者对一种特定类型对象的计数

①有限的范围
②所有的成员
③特定的类型

根据枚举的定义:
在这里插入图片描述

数图形的时候∶

只在一个大图中数。——有限的范围
要求在各种几何形状数图形——所有的成员
从中统计矩形的数量——特定的类型

有同学可能会问∶所有的成员为什么是各种几何图形,而不是所有的矩形呢?
归根结底就是枚举时宁可多,但不能漏!

如果能确定某个问题的答案在一定的范围内,那么我们就列举这个范围内的所有成员(或者确定能包括答案的特定成员),再通过筛选和判断锁定特定类型,最后得出答案。

定范围
列成员
选类型
算答案

枚举举例

题目描述 统计因数

题目描述
任意一个自然数N都可以分解质因数,如果写出如下形式:
N=P1M1∗P2M2∗...∗PnMnN=P_{1}^{M1}*P_{2}^{M2}*...*P_{n}^{Mn}N=P1M1P2M2...PnMn
那么N一共有有(M1+1)∗(M2+1)∗...∗(Mn+1)(M1+1)*(M2+1)*...*(Mn+1)(M1+1)(M2+1)...(Mn+1)个因数,包括1和N本身
例如36=22∗3236=2^{2}*3^{2}36=2232,那么36一共有(2+1)*(2+1)=9个因数,包括1和36.
解题思路
用枚举思想来验证:

  1. 定范围:36的因数一定是1到36之间的正整数
  2. 列成员 1 2 3 4 …36
  3. 选类型+算答案 1.2.3.4.6.9.12.18.36,共9个。
#include <iostream>
//#include<bits/stdc++.h>using namespace std;int main()
{int s=0;for(int i =1; i<=36; i++ ){if(36%i==0) {cout<<i<<" ";s++;}}cout<<endl<<s;return 0;
}

输出为:
在这里插入图片描述

题目描述 质数判定

题目描述
如果一个数n,除了1和他本身,没有其他的因数,这个数就是质数
方法一:枚举所有可能是n的因数的数,统计有多少个因数,如果只有两个,那么这个数是质数,否则不是。
方法二:枚举2到n-1之间的自然数,如果存在n的因数,那么这个数可定不是质数,如果不存在n的因数,那么这个数是质数

那么我们怎么“定范围”?——按照方法一的话,范围就是1到这个数本身。
怎么列成员——列举所有的自然数
怎么选类型——判断是否能整除给定数字
怎么算答案——找到一个整除的,则统计因数增加一次,最后看有多少个因数。如果只有2个,那就是质数,否则是合数。

错误方法一:

#include <iostream>
//#include<bits/stdc++.h>using namespace std;int main()
{int n=0;cin>>n;int flag = 1;//1表示是质数,0表示不是质数for(int i =2; i<=n-1; i++ ){if(n%i==0) {flag = 0;}else{flag = 1;}}if(flag==1) cout<<"是质数";else cout<<"不是质数";return 0;
}

优化方法1: 用break实现优化

#include <iostream>
//#include<bits/stdc++.h>using namespace std;int main()
{int n=0;cin>>n;int flag = 1;//1表示是质数,0表示不是质数for(int i =2; i<=n-1; i++ ){if(n%i==0) {flag = 0;break;}}if(flag==1) cout<<"是质数";else cout<<"不是质数";return 0;
}

质数判定的进一步优化∶平方根优化。其实我们还可以进一步缩小枚举的范围。过去我们枚举的范围是2到n-1,其实并不必要,只要枚举2-sqrt(n)即可。这是因为,如果n能够分解成两个数的乘积,那么其中一个必须≤sqrt(n),另外一个≥sqrt(n);这里,sqrt(n)表示n的平方根。
测试2147483647

优化方法2: sqrt(n)

#include <iostream>
#include<cmath>
//#include<bits/stdc++.h>using namespace std;int main()
{int n=0;cin>>n;int flag = 1;//1表示是质数,0表示不是质数int t = sqrt(n);for(int i =2; i<=t; i++ ){if(n%i==0) {flag = 0;break;}}if(flag==1) cout<<"是质数";else cout<<"不是质数";return 0;
}

题目描述 水仙花数

题目描述
水仙花数是一种自幂数,有如下两个特点:
1.是三位数
2.各个数位上的数字的三次方和等于他本身,六日
153= 111 + 555 + 333
输入

输出
所有的水仙花数,每一个数字占一行。
样例输入

样例输出
153

解题思路

定范围:所有的三位数 100-999
列成员:100-999之间所有的自然数
选类型:符合各个数位上数字的三次方和等于本身的才是特点的类型
算答案:找到特点类型数字马上输出
在这里插入图片描述

#include <iostream>
//#include<bits/stdc++.h>using namespace std;int main()
{for(int i =100; i<=999; i++ ){int a=i/100,b=i/10%10,c=i%10;if(a*a*a+b*b*b+c*c*c==i) cout<<i<<endl;}return 0;
}

输出入下:
在这里插入图片描述

题目描述 7744问题

题目描述
列出所有满足下列条件的数字
1.是四位数
2.是完全平方数
3.前2位数字相同,后2位数字也相同
输入

输出
每行一个符合条件的数字
样例输入

样例输出
7744

实现方法1

定范围:所有的四位数 1000-9999
列成员:100-9999之间所有的自然数
选类型:
符合完全平方数,即sqrt(i) = (int)sqrt(i);
且前2位数字相同,后两位数字相同
int a = i/1000,b=i/100%10,c=i/10%10,d=i%10;
if(a==b && c==d)
算答案:找到特点类型数字马上输出

#include <iostream>
#include<cmath>
//#include<bits/stdc++.h>using namespace std;int main()
{for(int i =1000; i<=9999; i++ ){if(sqrt(i)==(int)sqrt(i)){int a=i/1000,b=i/100%10,c=i/10%10,d=i%10;if(a==b&&c==d) cout<<i<<endl;}}return 0;
}

优化方法2

【7744问题-浮点数运算有误差,如果想避开浮点数应该如何做?】

列成员
用循环变量直接列举1000~9999的完全平方数;
枚举i*i的值,而不是仅枚举i,我们需要根据此需要确定i的范围
定范围
由10000>9999> =i*i>=1000推知:99> =i>=32 ;
for(int i=32;i<=99;i++){
int t=i*i;
}
选类型
前两位相同,后两位相同
把四个数位上数字分别取出再比较:
int a=t/1000,b=t/100%10,c=t/10%10,d =t%10;. if(a= =b&&c==d)则前两位相同,后两位相同;
算答案:
符合条件的t是答案

#include <iostream>
//#include<bits/stdc++.h>using namespace std;int main()
{for(int i =32; i<=99; i++ ){int t=i*i;int a=t/1000,b=t/100%10,c=t/10%10,d=t%10;if(a==b&&c==d) cout<<t<<endl;}return 0;
}

题目描述 余数相同问题

题目描述
已知三个正整数a,b,c。
现有一个大于1的整数x,将其作为除数分别除a, b,c,得到的余数相同。请问满足上述条件的x的最小值是多少?
数据保证x有解。
输入
一行,三个不大于1000000的正整数a, b,c,两个整数之间用一个空格隔开。
输出
一个整数,即满足条件的x的最小值。
样例输入
300 262 205
样例输出
19

定范围:
数据保证有解,只需要求x最小的值。上限不需确定,找到解后,break就可。
保险起见,余数不会大于被除数和除数,范围可以设定位2到三个数字中的任意一个。
列成员:
从小到大列举范围内的整数
for(int i=2;i<=a;i++){
}
选类型:
分别除以a,b,c 得到的余数相同 a%i==b%i&&b%i==c%i
算答案:
找到特点类型数字i马上输出

#include <iostream>
//#include<bits/stdc++.h>using namespace std;int main()
{int a,b,c;cin>>a>>b>>c;for(int i=2;i<=a;i++){if(a%i==b%i && b%i==c%i){cout<<i;break;}}return 0;
}

题目描述 特殊自然数

题目描述
一个十进制自然数,他的七进制和九进制表示都是三位数,且七进制和九进制数码的表示顺序正好相反,编程求此自然数,并输出显示。
输入

输出
三行:
第一行是此自然数的十进制表示;
第二行是此自然数的七进制表示;
第三行是此自然数的九进制表示。
样例输入

样例输出

预备知识

十进制与N进制的互相转换:
N进制:位权为N的数制。
十进制:(1234)10=1∗103+2∗102+3∗101+4∗100(1234)_{10}=1*10^{3}+2*10^{2}+3*10^{1}+4*10^{0}(1234)10=1103+2102+3101+4100
从低位到高位分别为第0位,第1位,第2位…
七进制:
(1234)7=1∗73+2∗72+3∗71+4∗70(1234)_{7}=1*7^{3}+2*7^{2}+3*7^{1}+4*7^{0}(1234)7=173+272+371+470
把N进制的数字按照 位权 展开,计算得到的数字就是十进制的数字了。
N进制下的数位拆分:
十进制下,M%10=十进制表示下的最末尾。
N进制下,M%N=N进制表示下的最末尾。
(1234)7=1∗73+2∗72+3∗71+4∗70(1234)_{7}=1*7^{3}+2*7^{2}+3*7^{1}+4*7^{0}(1234)7=173+272+371+470
(1234)7%7=(1∗73+2∗72+3∗71+4∗70)%7=4(1234)_{7}\%7=(1*7^{3}+2*7^{2}+3*7^{1}+4*7^{0})\%7=4(1234)7%7=(173+272+371+470)%7=4余数定理

在这里插入图片描述

定范围:
在十进制下定范围,七进制和九进制下是三位数
七进制下的最大数位666,最小的三位数位100,转换为十进制得到范围为(100)7=49,(666)7=6∗49+6∗7+6∗1=342(100)_{7}=49,(666)_{7}=6*49+6*7+6*1=342(100)7=49,(666)7=649+67+61=342范围i为[49,342]
九进制下的最大数位888,最小的三位数位100,转换为十进制得到范围为(100)9=81,(888)9=8∗81+8∗9+8∗1=728(100)_{9}=81,(888)_{9}=8*81+8*9+8*1=728(100)9=81,(888)9=881+89+81=728范围i为[81,728]
取公共部分,这个数在十进制表示下,应属于[81,342]
列成员:
列举从81-342范围内的整数
for(int i=81;i<=342;i++){
}
选类型:
七进制和九进制下数字正好相反,设七进制下ABC,九进制下abc
int A=i/7/7%7,B=i/7%7,C=i%7;
int a=i/9/9%9,b=i/9%9,C=i%9;
如果A==c&&B==b&&C==c,那么i符合题意
算答案:
若符合提议,则输出答案,依次输出i,ABC,abc每个答案占据一行

#include <iostream>
//#include<bits/stdc++.h>using namespace std;int main()
{for(int i=81;i<=342;i++){int A,B,C,a,b,c;A=i/7/7%7,B=i/7%7,C=i%7;a=i/9/9%9,b=i/9%9,c=i%9;if(A==c&&B==b&&C==a){cout<<i<<endl;cout<<A<<B<<C<<endl;cout<<a<<b<<c<<endl;}}return 0;
}

输出为:
在这里插入图片描述

总结

枚举思想
枚举的一般解题步骤
运用枚举的思想解决因数统计、质数判断等问题质数判断的平方根优化
break和continue
N进制的定义

作业

在这里插入图片描述

在这里插入图片描述

在线练习:

http://noi.openjudge.cn/

总结

本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++循环结构的中的枚举案例,包括相关案例练习。

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

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

相关文章

视频投票和图文投票之间的差异投票链接制作平台微擎投票

“我的舞台我的梦”网络评选投票_线上小程序的投票方式_视频投票的功能_在线投票程序用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服…

嵌入物理(PINN)还是基于物理(AD)?

文章目录1. 传统"反演问题"1.1 反演问题是什么1.2 常见反演问题1.3 传统反演问题的困境2. 深度学习优势3. AD inversion 例子3.1 ADsurf3.2 ADseismic关于PINN的内容大家可以直接google PINN (Physical-informed neural network),其主要的目的是用一个神经网络拟合物…

Docker--------Day1

1.简介 您要如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; Docker之所以发展如此迅速&#xff0c;也是因为它对此给出了一个标准化的解决方案-----…

Linux进程概念讲解

1、进程的基本概念在给进程下定义之前&#xff0c;我们先了解一下进程&#xff1a;我们在编写完代码并运行起来时&#xff0c;在我们的磁盘中会形成一个可执行文件&#xff0c;当我们双击这个可执行文件时&#xff08;程序时&#xff09;&#xff0c;这个程序会加载到内存中&am…

从全局变量寻找到Tomcat回显方式

前言 对于回显的获取主要是在ApplicationFilterChain类的lastServicedRequest / lastServicedResponse两个属性&#xff0c;是使用的ThreadLocal进行修饰的&#xff0c;并且&#xff0c;在执行请求的过程中&#xff0c;通过反射修改属性值&#xff0c;能够记录下当前线程的req…

camera 硬件基本知识

参考博客&#xff1a;1.【Camera专题】Qcom-你应该掌握的Camera调试技巧2_c枫_撸码的日子的博客-CSDN博客_outputpixelclock 2.浩瀚之水_csdn的博客_CSDN博客-深度学习,嵌入式Linux相关知识汇总,Caffe框架领域博主 3.一个早起的程序员的博客_CSDN博客-FPGA,PCIe应用实战,PCI-E…

Introduction to Multi-Armed Bandits——05 Thompson Sampling[3]

Introduction to Multi-Armed Bandits——05 Thompson Sampling[3] 参考资料 Russo D J, Van Roy B, Kazerouni A, et al. A tutorial on thompson sampling[J]. Foundations and Trends in Machine Learning, 2018, 11(1): 1-96. ts_tutorial 项目代码地址: https://githu…

【自然语言处理】主题建模:Top2Vec(理论篇)

主题建模&#xff1a;Top2Vec&#xff08;理论篇&#xff09;Top2Vec 是一种用于 主题建模 和 语义搜索 的算法。它自动检测文本中出现的主题&#xff0c;并生成联合嵌入的主题、文档和词向量。 算法基于的假设&#xff1a;许多语义相似的文档都可以由一个潜在的主题表示。首先…

苏宁基于 AI 和图技术的智能监控体系的建设

汤泳&#xff0c;苏宁科技集团智能监控与运维产研中心总监&#xff0c;中国商业联合会智库顾问&#xff0c;致力于海量数据分析、基于深度学习的时间序列分析与预测、自然语言处理和图神经网络的研究。在应用实践中&#xff0c;通过基于 AI 的方式不断完善智能监控体系的建设&a…

如何快速掌握DDT数据驱动测试?

如何快速掌握DDT数据驱动测试&#xff1f; 目录&#xff1a;导读 前言 实施数据驱动步骤 数据驱动测试环境准备 测试步骤 数据存储 数据存在当前脚本中 json文件读取测试数据进行数据驱动测试 从xml读取数据进行数据驱动测试 总结 写在最后 前言 网盗概念相同的测试…

SpringBoot整合分布式锁redisson

1、导入maven坐标<!-- 用redisson作为所有分布式锁&#xff0c;分布式对象等功能框架--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.5</version></dependency>2、red…

Kafka第三章:新旧节点更替

系列文章目录 Kafka第一章&#xff1a;环境搭建 Kafka第二章&#xff1a;生产者案例 Kafka第三章&#xff1a;新旧节点更替 文章目录系列文章目录前言一、创建新节点1.克隆节点2.修改Kafka配置二、添加新节点1.启动集群2.启动105的Kafka3.创建一个要均衡的主题4.生成一个负载均…

C++项目——高并发内存池(1)--介绍及定长内存池

1.什么是内存池 1.1 池化技术 将程序中需要经常使用的核心资源先申请出来&#xff0c;放在一个池内&#xff0c;由程序自己管理&#xff0c;这样可以提高资源的使用效率&#xff0c;也可以保证本程序占有的资源数量。 比如之前博文实现的线程池&#xff0c;就是预先的申请出…

第四次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept)学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键课程表&#xff1a;Course (Cno, Cname)课程号&#xff0c;课程名 Cno为主键学生选课表&#xff1a;SC (Sno, Cno, Score)学号&…

面试经常被问悲观锁和乐观锁?什么是cas?来我花3分钟时间告诉你

锁大家都知道吧&#xff0c;多线程访问资源会存在竞争&#xff0c;那么就需要加锁进而让多个线程一个一个访问。 比如有一个房间&#xff0c;一次只能进一个人&#xff0c;现在有十个人都想进去怎么办&#xff1f; 对&#xff0c;加锁。拿一把钥匙&#xff0c;谁抢到钥匙谁就…

微服务 ModuleFederationPlugin Vue项目体验

随着公司项目的模块越来越多&#xff0c;每次打包后的项目都非常大&#xff0c;而且每修改一个小的模块&#xff0c;都会将整个项目打包&#xff0c;会非常的麻烦&#xff0c;随着前端的发展&#xff0c;微服务的出现&#xff0c;很好的解决了项目庞大的问题&#xff0c;而且每…

大数据处理学习笔记1.4 掌握Scala运算符

文章目录零、本讲学习目标一、运算符等价于方法&#xff08;一&#xff09;运算符即方法&#xff08;二&#xff09;方法即运算符1、单参方法2、多参方法3、无参方法二、Scala运算符&#xff08;一&#xff09;运算符分类表&#xff08;二&#xff09;Scala与Java运算符比较三、…

I.MX6ULL_Linux_系统篇(17) uboot分析-启动linux

bootz 启动 Linux 内核 images 全局变量 不管是 bootz 还是 bootm 命令&#xff0c;在启动 Linux 内核的时候都会用到一个重要的全局变量&#xff1a;images&#xff0c; images 在文件 cmd/bootm.c 中有如下定义&#xff1a; images 是 bootm_headers_t 类型的全局变量&…

03- 通过OpenCV进行图像变换 (OpenCV基础) (机器视觉)

知识重点 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 图像的放大与缩小, 变形 flip(src, flipCode) 图像的翻转 rotate(img, rotateCode) 图像的旋转 warpAffine(src, M, dsize, flags, mode, value) 仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通…

Windows10神州网信政府版麦克风、摄像头的使用

Windows10神州网信政府版默认麦克风摄像头是禁用状态&#xff0c;此禁用状态符合版本规定。 在录课和直播过程中&#xff0c;如果需要使用麦克风和摄像头的功能&#xff0c;可以这样更改&#xff1a; 1、鼠标右键点击屏幕左下角的开始菜单图标&#xff0c;选择windows中的“运…