当前位置: 首页 > news >正文

蓝桥杯常考的找规律题

目录

灵感来源:

B站视频链接:

找规律题具有什么样的特点:

报数游戏(Java组):

题目描述:

题目链接:

思路详解:

代码详解:

阶乘求和(Java组):

题目描述:

题目链接:

前置知识:

思路详解:

代码详解:

数字诗意(C/C++组):

题目描述:

题目链接:

思路详解:

代码详解:

平方差(C/C++组):

题解链接:


灵感来源:

这篇博客相当于一个题解合集,灵感来源于B站UP主“溶金落梧桐”,视频标题为“蓝桥杯常考的找规律题,学会思路轻松拿捏”。这个UP主是我在考试前刷到的,这位大佬分享了很多蓝桥杯的学习视频,大家可以去B站了解学习。下面我会把视频链接附上,建议大家自行观看视频学习,我的博客主要是对代码进行了整理合集,也算是自己拿来复习总结的资料

温馨提示:这里面的题目包含C/C++组,Java组以及Python组的题目,但是我这里全部都是用C/C++的方法写的题解

B站视频链接:

【蓝桥杯常考的找规律题,学会套路轻松拿捏】

找规律题具有什么样的特点:

数据非常大,通常大于10^8,看上去非常吓人,肯定暴力跑不出来

找规律题的两个特性:

1.周期性(结果在固定后重复)

2.答案符合某种递推式

报数游戏(Java组):

题目描述:

题目链接:

蓝桥云课 报数游戏

思路详解:

找规律,先尝试写出序列中的前100项,具体可以结合代码看,代码注释的非常具体

代码详解:

#include<bits/stdc++.h>  //蓝桥杯常考的找规律题,特点:数据非常大,通常大于10^8,看上去非常吓人,肯定 
using namespace std;     //暴力跑不出来 
//这题要求满足题目要求的第202420242024个数是多少,这个数据大约为2*10^11,真暴力用电脑跑得3000s左右
//而且考试的机子比自己的电脑更慢
int main()
{printf("2429042904288");return 0;
}
//该怎么办呢? 找规律,先尝试写出序列中的前100项 
//int ans;    ans用于记录当前枚举到第几个数,用于终止枚举 
//
//int main()
//{
//	for(int i=1;;i++)
//	{
//		if(ans==100)
//		{
//			return 0;
//		}
//		if(i%20==0||i%24==0)
//		{
//			cout<<i<<endl;
//			ans++;
//		}
//	}
//}
//20 24 40 48 60 72 80 96 100 120 140 144 160 168
//找规律发现第偶数位都是24的倍数,第2位是24,第4位是48,第6位是72
//可以总结出第i(i是偶数)位是24*(i/2),所以第202420242024位是24*101210121012=2429042904288

阶乘求和(Java组):

题目描述:

题目链接:

蓝桥云课 阶乘求和

前置知识:

1.如何求阶乘的和?定义fac来维护i的阶乘,用ans累加求和

题目链接:

B2153 求阶乘的和 - 洛谷

代码:

#include<bits/stdc++.h>
using namespace std;int n;
int ans;int main()
{cin>>n;int fac=1;  //用fac来维护i的阶乘 for(int i=1;i<=n;i++){fac=fac*i;ans+=fac;}cout<<ans<<endl;return 0;
}

2.阶乘尾零:对于n!,随着n变大,n!末尾的0一定越多。题目要求202320232023!的末尾9位数字,这个数据范围是2*10^11,显然暴力做不了,如果知道阶乘尾零的性质,就可以知道其实n大到某一个程度之后再增大末尾9位数字是不变的

3.模运算的加法分配律:(a+b)%p=(A%p+b%p)%p,为什么要用到模运算的加法分配律,因为当计算阶乘之和时,阶乘的值会迅速增大,可能会爆long long导致溢出错误

思路详解:

数据范围是2*10^11,显然暴力做不了,如果知道阶乘尾零的性质,就可以知道其实n大到某一个程度之后再增大末尾9位数字是不变的

如果不知道阶乘尾零的性质,就先尝试前100项再找规律

代码详解:

#include<bits/stdc++.h>  //蓝桥杯常考的找规律题 
using namespace std;     //有个东西叫阶乘尾零:对于n!,随着n变大,n!末尾的0一定越多 
//题目要求202320232023!的末尾9位数字,这个数据范围是2*10^11,显然暴力做不了,如果知道阶乘尾零的性质,
//就可以知道其实n大到某一个程度之后再增大末尾9位数字是不变的int main()
{printf("420940313");return 0;
}
//如果不知道阶乘尾零的性质,就先尝试前100项再找规律
//题目求阶乘末尾的9位数字怎么办? %1e9即可
//模运算的加法分配律:(a+b)%p=(A%p+b%p)%p,为什么要用到模运算的加法分配律,因为当计算阶乘之和时,阶乘
//的值会迅速增大,可能会爆long long导致溢出错误 
//int main()
//{
//	long long x=1e9;
//	long long ans=0;
//	long long fac=1;            定义fac是为了维护i的阶乘 
//	for(int i=1;i<=100;i++)
//	{
//		fac=(fac*i)%x;          fac=fac*i;  实际上先求阶乘之和再取模可能会爆long long导致溢出错误 
//		ans=(ans+fac)%x;        ans+=fac;
//		cout<<ans<<endl;        ans%=x;      在取模之前可能ans就已经溢出了,所以输出结果会出现负数 
//	}                           cout<<ans<<endl;
//	return 0;
//}
//通过输出可以发现规律,到后面n越来越大的时候,后9位数字其实都一模一样,更不用说n=202320232023了
//如何理解代码中模运算的加法分配律的使用:
//fac=fac*i表示求单个阶乘 eg:1! 2! 3! 4!
//fac=(fac*i)%1e9表示每个单个阶乘取模于1e9 eg:(1!)%1e9 (2!)%1e9
//ans+=fac表示把单个阶乘加起来求和,即阶乘之和 eg:1!+2!+3!+4!
//fac=(fac*i)%1e9和ans=(ans+fac)%1e9表示之前的结果加上单个阶乘取模于1e9的整体再取模于1e9
//即i=1时,ans=(1!%1e9)%1e9  i=2时ans=((1!%1e9)%1e9+(2!%1e9))%1e9

数字诗意(C/C++组):

题目描述:

题目链接:

P10900 [蓝桥杯 2024 省 C] 数字诗意 - 洛谷

数字诗意 - 蓝桥云课

思路详解:

先暴力写个100项看看有没有什么规律,代码里注释的很详细,结合代码看就行

代码详解:

#include<bits/stdc++.h> //蓝桥杯常考的找规律的题,一看题目数据ai最大为10^16,就想一下能不能规律 
using namespace std;    //先暴力写个100项看看有没有什么规律 const int N=2e5+10;     //开大一点,防止数字越界 int n;
long long a[N]; //由题ai最大为10^16,会爆int,所以开long long 
int ans; //由题ans记录要删除的数字个数,找规律发现要删的是2的幂次方,由于指数爆炸所以ans开int就行 int main()
{cin>>n;for(int i=0;i<n;i++){scanf("%lld",&a[i]);int x=log2(a[i]);  //对a[i]进行以2为底的对数运算,int x所以x取的是运算结果的整数部分 if((long long)1<<x==a[i]) //1<<x表示将1左移x位,即2^x的幂运算 {                         //2^x可能会爆int,开个强制类型转换再判断是否等于a[i] ans++;     //等于a[i]就说明log2(a[i])就是没有小数部分,即a[i]就是2的幂次方 }}cout<<ans<<endl;return 0;
}
//bool check(int x)
//{
//	for(int i=1;i<x;i++) //i表示的是从i开始枚举连续的正整数,i=5表示从5开始枚举 
//	{
//		int sum=0;       //每次从i开始枚举都要定义sum=0 
//		for(int j=i;j<x;j++) //j表示的是枚举的正整数,这个for循环是枚举连续正整数求和的过程 
//		{
//			sum+=j; //每枚举一个数就加到sum
//			if(sum==x) //每枚举一个数就判断sum,如果sum==x表示x可以用至少两个连续的正整数表示 
//			{
//				return true;
//			}
//		}
//	}
//	return false;
//}
//
//int main()
//{
//	for(int i=3;i<=10000;i++) //由题1和2不能用至少两个连续的正整数相加,所以从3开始 
//	{
//		if(check(i)==false) //false表示不能用至少两个连续的正整数相加 
//		{
//			cout<<i<<' ';   //把不满足要求的输出来看看有没有规律 
//		}
//	}
//	return 0;
//}
//i<=100中不能用至少两个连续的正整数相加的是4 8 16 32 64 好像是2的幂次方就不满足,再多枚举一点试试 
//i<=1000中不能用至少两个连续的正整数相加的是4 8 16 32 64 128 256 512
//i<=10000,4 8 16 32 64 128 256 512 1024 2048 4096 8192       跑了75s出结果 

平方差(C/C++组):

这题之前已经写了一篇很详细的题解,还包括平方差结论,平方差结论拓展的补充题目,下面直接附上链接

题解链接:

第十四届蓝桥杯 2023 C/C++组 平方差-CSDN博客

蓝桥村的真相(Python组):

题目描述:

题目链接:

P11003 [蓝桥杯 2024 省 Python B] 蓝桥村的真相 - 洛谷

蓝桥村的真相 - 蓝桥云课

思路详解:

这题不像之前几题那样暴力前100项找规律,因为确实满足要求的判断也比较难写。实际这题是直接通过分析来找规律的,分析过程看草稿纸图片

代码详解:

#include<bits/stdc++.h> //蓝桥杯常考的找规律题,数据范围n<=10^18非常大,暴力一定超时,一定要找规律 
using namespace std;    //这题不像之前几题那样暴力前100项找规律,因为确实满足要求的判断也比较难写 //实际这题是直接通过分析来找规律的,分析过程看草稿纸图片 
const int T=1e5+10;
const long long N=1e18+10;int t;int main()
{cin>>t;while(t--){long long n;scanf("%lld",&n);if(n%3==0)                //当n能整除3时,答案为2*n {printf("%lld\n",2*n);}else                      //当n不能整除3时,答案为n {printf("%lld\n",n);}}return 0;
}

相关文章:

  • 小白工具视频转MPG, 功能丰富齐全,无需下载软件,在线使用,超实用
  • hi3516cv610构建音频sample工程代码步骤
  • 【Nova UI】六、SASS 赋能组件库:通用方法与混入的变革力量
  • 【FreeRTOS】简介
  • 使用resend通过调用api接口的方式发送邮件,可以自定义域
  • 模型 螃蟹效应
  • 前台调用接口的方式及速率对比
  • 品牌如何通过朝日新闻出海日本?——某企业日本媒体发稿实战
  • XSS的应用
  • 工厂模式:工厂方法模式 和 抽象工厂模式
  • 闲聊人工智能对媒体的影响
  • 20.4 显示数据库数据
  • rpm命令详解
  • 【通过Docker快速部署Tomcat9.0】
  • 考研单词笔记 2025.04.22
  • rgw的d3n功能配置
  • 使用Java对接StockTV全球金融数据API。马来西亚金融数据API
  • B + 树与 B 树的深度剖析
  • 【扫描件批量改名】批量识别扫描件PDF指定区域内容,用识别的内容修改PDF文件名,基于C++和腾讯OCR的实现方案,超详细
  • pdf多文件合并
  • 特斯拉季度利润暴跌71%,马斯克下月开始大幅减少为政府工作时间
  • 经济日报:锚定重点领域和关键环节,上海浦东谋划高水平对外开放
  • 深一度|上海半马,展示“体育+”无限可能的路跑狂欢
  • ETF市场规模首破4万亿,月内ETF基金净流入超3000亿
  • 上海这台人形机器人完成半马:无故障、无摔倒,冲过终点不忘挥手致意
  • 鲜花妆上海,花香荟申城!2025上海国际花展开幕,龚正出席并启动花展