蓝桥杯常考的找规律题
目录
灵感来源:
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;
}