一、巧用Excel
Excel在解决某些数学问题时非常高效,特别是涉及表格计算、简单统计和可视化分析时。
这道题是一道基础题,只需要判断每个数字有几个2,然后在加起来即可,但是还有更简单的方法,先通过编译器,将1-2020输出出来,然后将其复制到Excel上,使用Excel上的查找功能,然后用替换功能将2替换成任何字符,从弹出的替换结果对话框中可以可能到完成“642”处的替换,因此答案就是624
日期问题
在Excel中,在A1单元格中输入日期1901年1月1日,在B1单元格中输入日期2000年12月31日,然后将B1与A1相减得到36524天,然后chu'y
二、手算技巧
对于简单的计算题,手算可能是最快的方法,但要注意:
- 确保计算精度
- 验证计算结果
- 适用于小规模数据
三、Python的优势
Python在处理字符、大数运算、日期问题等方面具有明显优势。
1. 日期处理
Python的datetime库提供了强大的日期处理功能:
from datetime import *
date1 = datetime(1901, 1, 1)
date2 = datetime(2000, 12, 31)
print(date1.weekday()) # 周一为0,周日为6
timedelta = date2 - date1
print(timedelta.days // 7) # 计算周数差
2. 顺子日期问题
Python实现:
from datetime import *
date1 = datetime(2022, 1, 1)
cnt = 0
for i in range(0, 365):
s = "%02d%02d%02d" % (date1.year, date1.month, date1.day)
date1 += timedelta(days=1)
if "012" in s or "123" in s or "234" in s or "345" in s or "456" in s or "678" in s or "789" in s:
cnt += 1
print(cnt)
C++实现:
#include <bits/stdc++.h>
using namespace std;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(string s) {
for(int i = 0; i+2 < s.size(); i++)
if(s[i]+1 == s[i+1] && s[i]+2 == s[i+2])
return true;
return false;
}
int main() {
int y = 2022, m = 1, d = 1;
int cnt = 0;
for(int i = 0; i < 365; i++) {
char s[10];
sprintf(s, "%04d%02d%02d", y, m, d);
if(check(s)) cnt++;
d++;
if(d > months[m]) {
d = 1;
m++;
}
}
cout << cnt << endl;
return 0;
}
四、大数运算
Python处理大数运算非常方便,无需考虑溢出问题。
1. 乘积尾零问题
nums = [5650, 4542, 3554, ...] # 100个数字
s = 1
for i in nums:
s *= i
cnt = 0
while s % 10 == 0:
s //= 10
cnt += 1
print(cnt)
2. 大数相乘问题
Python解法:
for i in range(1, 1000000008):
if (i * 2021) % 1000000007 == 999999999:
print(i)
break
C++需要使用快速幂和模逆元:
#include <iostream>
using namespace std;
const long long MOD = 1000000007;
long long fastPow(long long a, long long b, long long mod) {
long long res = 1;
a %= mod;
while (b > 0) {
if (b % 2 == 1) {
res = (res * a) % mod;
}
a = (a * a) % mod;
b /= 2;
}
return res;
}
int main() {
const long long target = 999999999;
const long long multiplier = 2021;
long long inv_2021 = fastPow(multiplier, MOD - 2, MOD);
long long i = (target * inv_2021) % MOD;
cout << i << endl;
return 0;
}
五、字符处理
Python在字符串处理方面非常强大。
1. 平方和问题
Python实现:
sum = 0
for i in range(1, 2020):
s = str(i)
if '2' in s or '0' in s or '1' in s or '9' in s:
sum += i * i
print(sum)
C++实现:
#include <bits/stdc++.h>
using namespace std;
bool containsDigits(int num) {
string s = to_string(num);
for (char c : s) {
if (c == '2' || c == '0' || c == '1' || c == '9') {
return true;
}
}
return false;
}
int main() {
long long sum = 0;
for (int i = 1; i < 2020; ++i) {
if (containsDigits(i)) {
sum += i * i;
}
}
cout << sum << endl;
return 0;
}
2. 三角回文数
for k in range(4000, 20000):
n = k * (k + 1) // 2
s = str(n)
if s[::-1] == s:
print(k, n)
break
六、杂题技巧
蓝桥杯中有些题目不需要复杂算法,主要考察思维逻辑。
1. 裁纸刀问题
两种解法:
- 模拟法:4(边界) + 19(行) + 21×20(列) = 443
- 扩展法:4(边界) + 439(增加纸张) = 443
2. 修建灌木
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
cout << max(i, n-i-1) * 2 << endl;
}
return 0;
}