目錄
靈感來源:
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;
}