C/C++暴力/枚举/穷举题目持续更新(刷蓝桥杯基础题的进!)

目录

前言

 一、百钱买百鸡

二、百元兑钞

三、门牌号码(蓝桥杯真题)

 四、相乘(蓝桥杯真题)

五、卡片拼数字(蓝桥杯真题)

六、货物摆放(蓝桥杯真题)

七、最短路径(蓝桥杯真题)

八、完数(蓝桥杯真题)


前言

  循环有while,do-while,for三种形式,三者各自可以自己嵌套自己,也可以交叉嵌套。暴力破解法(穷举法)(枚举法),即用循环把该有的结果全部遍历出来,之后再用if语句做筛选,判断这个答案是不是我们需要的,此思想在蓝桥杯竞赛中相当重要。

解决此类题目的思路:

  首先我们应该确定穷举范围,不能多,不能少,要不然就容易漏掉一个。其次想应该用什么方式穷举,单层for循环或者嵌套,然后想if的判断条件。

  下面几道例题具体展现暴力的思想,每道题均采用问题描述,分析,代码实现和运行结果的形式呈现。

 一、百钱买百鸡

问题描述:

  我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?

  翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?

分析:

  思路讲解:假设买的全为公鸡,则最能买到20只,即100/5=20,所以x<=20;同理若买的全为母鸡则100/3=33余1,y<=33;此处小心小鸡数目不是300,而应该是100,因为题目要求了要买100只鸡,所以z<=100; if语句满足三个条件:1、一百元 2、一百只鸡 3、小鸡数量是三的倍数。

代码实现:


#include<iostream>
using namespace std;int main() {int x, y, z;              //分别代表公鸡,母鸡,小鸡的数量for (x = 0; x <= 20; x++) {for (y = 0; y <= 33; y++) {for(z=0;z<=100;z++)if (z % 3 == 0 && (5 * x + 3 * y + z / 3) == 100 && (x+y+z)==100) //满足三个条件:1、一百元 2、一百只鸡3、小鸡数量是三的倍数
{   cout << "公鸡,母鸡,小鸡数:" << x << " " << y << " " << z << " " << endl;}}}
}

运行结果: 

二、百元兑钞

问题描述:

  一百元可以兑换多少张10元,5元,1元?有多少种兑换方法?要求每种情况都要包含10元,5元,1元。

分析:
  和第一道题思路一致,三重循环暴力破解,设置count值求解次数。

代码实现:


//百元兑钞问题
int main() {int a, b, c,count=0;for (a = 1; a < 10; a++) for(b=1;b<20; b++)for (c = 1; c < 100; c++) if (100 == a * 10 + b * 5 + c) {cout << "10元有:" << a << "张";cout << "5元有:" << b << "张";cout << "1元有:" << c << "张";cout << endl;count++;break;//提高效率,每次兑换方案成功后跳出最内层循环}cout << "共有" << count << "种兑换方法";return 0;
}

运行结果

三、门牌号码(蓝桥杯真题)

问题描述:

  小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。请问要制作所有的1到2020号门牌,总共需要多少个字符2?

分析:

  此题比较简单,问题简化为:1~2020总共有多少个2?用到求一个数各位数字的思想,即把当前这个数每一位都拆出来。

拆解一个数的各位代码

代码实现:

int main() {int count = 0;for (int i = 1; i <= 2020; i++) {int n = i;while (n != 0) {int t = n % 10;n /= 10;if (t == 2)count++;}}cout<<"0~2020共有" << count<<"个2";return 0;
}

运行结果: 

 四、相乘(蓝桥杯真题)

问题描述:

  小蓝发现,他将 1 至 1000000007 之间的不同的数与 2021 相乘后再求除以 1000000007 的余数,会得到不同的数。
  小蓝想知道,能不能在 1 至 1000000007 之间找到一个数,与 2021 相乘后 再除以 1000000007 后的余数为 999999999。
  如果存在,请在答案中提交这个数; 如果不存在,请在答案中提交 0。

分析:  

此题非常简单,分析省略。

代码实现:

int main() {unsigned long long i,n=1000000007,b=999999999;for(i=1;i<=n;i++)if (i * 2021 % n == b) {cout << i;}
}

运行结果:


 

五、卡片拼数字(蓝桥杯真题)

问题描述:

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。小蓝有很多数字卡片,每张卡片上都是数字0到9。小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从1拼到多少。例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼11时卡片1已经只有一张了,不够拼出11。现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?

分析:

依旧用到上一题求一个数各位数字的思想,比较拆出来的各位数和剩余卡片数量,卡片数量不够说明拼不了这个数字,这时退出循环,最多拼到上一个数。

代码实现:

int main()
{int cards[10] = { 2021,2021,2021,2021,2021,2021,2021,2021,2021,2021 };//定义一个整数数组cards,包含了数字0到9的卡片数量,每个数字的卡片数量都是2021int num = 1;  //ans代表所要拼接的数字int temp = 0; //用另一个变量操作numint temp2 = 0; //拆出的各位数字while (1) //用一个无限循环{temp = num;while (temp != 0)//第一次写的时候忘记了这条语句,当temp=0时,对该数操作完毕{temp2 = temp % 10;cards[temp2]--; //对应的该卡片数量减一if (cards[temp2] == 0) //说明对应卡片用完{cout << num - 1 << endl; //即最大的拼接数字为上一个数字return 0; //循环终止}temp = temp / 10;}num++;}return 0;

运行结果:

六、货物摆放(蓝桥杯真题)

问题描述:

  小蓝有一个超大的仓库,可以摆放很多货物。现在,小蓝有n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上分别堆L、W、H 的货物,满足n = L × W × H。给定n,请问有多少种堆放货物的方案满足要求。
例如,当n = 4 时,有以下6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
请问,当n = 2021041820210418 (注意有16 位数字)时,总共有多少种方案?

分析:

 当n = 4 时,1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。通过这个例子,可以看出找出n的所有因子并求出所有的组合方式,存放到数组中,再使用三重循环遍历所有因子,找出所有因子用到求素数的思想。

代码实现:

#include<iostream>
#include<cmath>
using namespace std;
typedef unsigned long long A;
//typedef 是一个类型声明语句,它用于定义一个新的数据类型标识符,给一个已有的数据类型取别名。
//即unsigned long long ==A;A n = 2021041820210418;
A a[3000], cnt = 0; //存放因子
int main(void)
{//找出所有因子放进数组,素数思想for (int i = 1; i <= sqrt(n); i++) {if (n % i == 0) {a[++cnt] = i;if (i * i != n) //简化寻找次数a[++cnt] = n / i;}}//循环A count = 0; //计数for (int l = 1; l <= cnt; l++)for (int w = 1; w <= cnt; w++)for (int h = 1; h <= cnt; h++)if (a[l] * a[w] * a[h] == n) count++;cout << count;return 0;}

运行结果: 

七、最短路径(蓝桥杯真题)

问题描述:

  小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。小蓝的图由2021 个结点组成,依次编号1 至2021。对于两个不同的结点a, b,如果a 和b 的差的绝对值大于21,则两个结点之间没有边相连;如果a 和b 的差的绝对值小于等于21,则两个点之间有一条长度为a 和b 的最小公倍数的无向边相连。

  例如:结点1 和结点23 之间没有边相连;结点3 和结点24 之间有一条无向边,长度为24;结点15 和结点25 之间有一条无向边,长度为75。
  请计算,结点1 和结点2021 之间的最短路径长度是多少。

分析:

求最小公倍数问题以及怎样找到并更新最短路径。

代码实现:

int main()
{int f[2022];  // 数组 f[j] 存放从节点 i到节点 j 的最短路径。memset(f, 0, sizeof f);for (int i = 1; i <= 2021; i++){for (int j = i + 1; j <= i + 21; j++) //考虑与节点 i 相差不超过 21 的节点 j。{if (j > 2021)//确保j不超出范围break;//把路径长度存储到数组中j对应的节点位置中if (f[j] == 0)  //如果节点 j 还没有被计算过(即 f[j] == 0),则将 f[j] 设置为从节点 i 到节点 j 的路径长度。f[j] = f[i] + j * i / gcd(i, j);   //j * i / gcd(i, j)为求最小公倍数elsef[j] = min(f[j], f[i] + j * i / gcd(i, j)); // 如果节点j已经有计算过的路径长度,则更新 f[j] 为当前的较短路径长度。}}cout << f[2021] << endl;return 0;
}

解释上面用到的函数:

1、memset(f, 0, sizeof f); 是一个用于将数组 f 中的所有元素初始化为 0 的函数调用。memset 是 C 标准库中的一个函数,用于将一段内存区域的每个字节设置为指定值,传递数组首地址,让memset 函数知道要操作的内存区域的起始地址,以及需要操作的字节范围。这种方式常用于在程序开始时将数组或其他内存区域初始化为特定的默认值,以确保它们在使用前具有一致的初始状态。这样可以消除未初始化变量可能导致的意外结果,并提高代码的可靠性。

2、min() 函数通常用于找出两个或多个值中的最小值。它可以是标准库中的函数,也可以是用户自定义的函数,C++ 标准库中的 min() 函数可能在 <algorithm> 头文件中定义,它接受两个或多个参数,并返回这些参数中的最小值。

运行结果:

八、完数(蓝桥杯真题)

问题描述:

编写一个程序,输出2~10000之间的所有完全数。完全数是指它的各因子(除该数本身外)之和正好等于该数本身的数。例如:6 = 1 + 2 + 3,28 = 1 + 2 + 4 + 7 + 14。

分析:

与第六题的货物摆放问题类似,首先找到所有一个数的所有因子,再判断。

代码:

#include <iostream>// 判断一个数是否为完数
bool isPerfectNumber(int number) {int sum = 0;for (int i = 1; i < number; i++) {if (number % i == 0) {sum += i;}}// 如果因子之和等于该数,则该数为完数return sum == number;
}int main() {for (int i = 1; i <= 10000; i++) {if (isPerfectNumber(i)) {std::cout << i << " 是完数" << std::endl;}}return 0;
}

运行结果:

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

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

相关文章

二蛋赠书十六期:《高效使用Redis:一书学透数据存储与高可用集群》

很多人都遇到过这么一道面试题&#xff1a;Redis是单线程还是多线程&#xff1f;这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程&#xff0c;说复杂是因为这个答案其实并不准确。 难道Redis不是单线程&#xff1f;我们启动一个Redis实例&#xff0c;验证一…

【Java程序设计】【C00262】基于Springboot的会员制医疗预约服务管理系统(有论文)

基于Springboot的会员制医疗预约服务管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的会员制医疗预约服务管理信息系统&#xff0c;本系统分为三种角色&#xff1a;管理员、医生和会员&#xff1b; 在系统…

Web3 基金会推出去中心化之声计划:投入高额 DOT 和 KSM ,助力去中心化治理

作者&#xff1a;Web3 Foundation Team 编译&#xff1a;OneBlock 原文&#xff1a;https://medium.com/web3foundation/decentralized-voices-program-93623c27ae43 Web3 基金会为 Polkadot 和 Kusama 创建了去中心化之声计划&#xff08;Decentralized Voices Program&…

【生活】浅浅记录

各位小伙伴们好鸭&#xff0c;今天不是技术文章&#xff0c;浅浅记录一下最近几个月的收获&#x1f60a; 新的一年&#xff0c;一起努力&#xff0c;加油加油&#xff01;

vue3(vite)+electron打包踩坑记录(1)

vue3(vite)electron打包踩坑记录 - 打包vue 第一步 编译vue 使用vite构建vue&#xff0c;package.json如下 {"name": "central-manager","private": true,"version": "0.0.0","type": "commonjs",&q…

2023年总结与2024展望

今天是春节后上班第一天&#xff0c;你懂的&#xff0c;今天基本上是摸鱼状态&#xff0c;早上把我们负责的项目的ppt介绍完善了一下&#xff0c;然后写了一篇技术文章&#xff0c;《分布式系统一致性与共识算法》。接着就看了我近几年写的的年度总结&#xff0c;我一般不会在元…

代码随想录算法训练营day27|39. 组合总和、40.组合总和II

39. 组合总和 如下树形结构如下&#xff1a; 选取第二个数字5之后&#xff0c;剩下的数字要从5、3中取数了&#xff0c;不能再取2了&#xff0c;负责组合就重复了&#xff0c;注意这一点&#xff0c;自己做的时候没想明白这一点 如果是一个集合来求组合的话&#xff0c;就需…

【C++精简版回顾】12.友元函数

1.友元函数 1.class class MM { public:MM(int age,string name):age(age),name(name){}friend void print(MM mm); private:int age;string name;void print() {cout << age << "岁的" << name << "喜欢你" << endl;} }; f…

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…

学习或从事鸿蒙开发工作,有学历要求吗?

目前安卓有2,000万的开发者。本科及以上学历占比为35%&#xff1b;iOS有2,400万开发者&#xff0c;本科及以上学历占比为40% 绝大多数的前端开发者都是大专及以下学历&#xff0c;在2023年华为开发者大会上余承东透露华为的开发者目前有200万&#xff0c;但鸿蒙开发者统计的数据…

【GAD】基于邻域重建的图异常检测

GAD-NR: Graph Anomaly Detection via Neighborhood Reconstruction 摘要contributionsMethodologyGAE via Neighborhood Reconstruction邻域重建整体重建损失 实验 WSDM2024Link Code | 摘要 图异常检测&#xff08;GAD&#xff09;是一种用于识别图中异常节点的技术&#x…

istio系列教程

istio学习记录——安装https://suxueit.com/article_detail/otVbfI0BWZdDRfKqvP3Gistio学习记录——体验bookinfo及可视化观测https://suxueit.com/article_detail/o9VdfI0BWZdDRfKqlv0r istio学习记录——kiali介绍https://suxueit.com/article_detail/pNVbfY0BWZdDRfKqX_0K …

在使用nginx的时候快速测试配置文件,并重新启动

小技巧 Nginx修改配置文件后需要重新启动&#xff0c;常规操作是启动在任务管理器中关闭程序然后再次双击nginx.exe启动&#xff0c;但是使用命令行就可以快速的完成操作。 将cmd路径切换到nginx的安装路径 修改完成配置文件后 使用 nginx -t校验nginx 的配置文件是否出错 …

力扣随笔之颜色分类(中等75)

思路&#xff1a;定义两个指针划分left&#xff0c;right划分三个区域left左边是红色区域&#xff0c;right右边是蓝色区域&#xff0c;left和right之间是白色区域&#xff1b;定义一个遍历指针遍历整个数组&#xff0c;遇到红色与left所指位置数字交换&#xff0c;并将left自加…

考研408深度分析+全年规划

408确实很难&#xff0c;他的难分两方面 一方面是408本身的复习难度&#xff0c;我们都知道&#xff0c;408的考察科目有四科&#xff0c;分别是数据结构&#xff0c;计算机组成原理&#xff0c;操作系统和计算机网络。大家回想一下自己在大学本科时候学习这些专业课的难度&am…

快速排序C语言实现程序

快速排序 快速排序算法一种最常见的排序算法&#xff0c;其核心思想就是 分治 &#xff0c;具体的&#xff1a;1&#xff09; 选定一个基准数&#xff1b;2&#xff09; 分区&#xff0c;将所有大于基准数的数据分为一区&#xff0c;将所有小于等于基准数的数据分为一区&#x…

Redis主从、哨兵、Redis Cluster集群架构

Redis主从、哨兵、Redis Cluster集群架构 Redis主从架构 Redis主从架构搭建 主从搭建的问题 如果同步数据失败&#xff0c;查看log日志报错无法连接&#xff0c;检查是否端口未开放出现”Error reply to PING from master:...“日志&#xff0c;修改参数protected-mode no …

《乱弹篇(十八)天灾人祸》

昨天午后笔者发表《贵州山火频发&#xff0c;令人扼腕痛惜》一文后&#xff0c;昨晚和今日上午又见社交网站上媒体发表的最新消息报道《南京一小区火灾已造成15死44伤&#xff0c;市长鞠躬道歉》《南京“223”火灾15死44伤&#xff1a;为啥1楼起火烧到了30层&#xff1f;除了电…

C/C++文件操作

一、文本文件操作 1、写文件操作 代码 #include<fstream> #include<iostream>int main() {ofstream outfile("Student.txt", ios::out);if (!outfile) {cout << "文件写入失败" << endl;exit(0); //程序终止}cout << &qu…

k8s-kubeapps部署 20

部署kubeapps应用&#xff0c;为Helm提供web UI界面管理&#xff1a; 下载最新版本的kubeapps并修改其values.yaml文件 下载并拉取所需镜像&#xff1a; 部署应用 添加解析 修改svc暴露方式为LoadBalancer 得到分配地址 访问http://192.168.182.102 授权并获取token 1.24前的…