暴力算法之-----打表
PS: 这是一种另辟蹊径的方法,主要是从数学的方面去考虑题目,这中方法适用于你无法直接看出该题目的规律的时候,或则这道题目和数学公式比较有关系的时候,这个时候你就可以打表慢慢找规律,然后将规律转化为表达式。
例题:P9231 [蓝桥杯 2023 省 A] 平方差
打表代码
ps:直接遍历打印处1-100满足条件的数字,然后根据打印结果,看看数字是否有什么规律,可以更改if条件打印不同的值,mark作为标记。
// 打表找规律
void find(){
for(int i=0;i<=100;i++){
for(int j=0;j<=100;j++){
for(int z=0;z<=100;z++){
if(!mark[i]){
if(i%2) continue;
if(i == j*j - z*z){
cout << i << endl;
mark[i] = true;
}
}
}
}
}
}
打印结果
ps:发现每一个奇数都满足条件,更改条件去除奇数后发现,每一个能被4整除的数也满足条件,所以可以写出代码。
0
1
3
4
5
7
8
9
11
12
13
15
16
17
19
20
21
23
24
25
27
28
29
31
32
33
35
36
37
39
40
41
43
44
45
47
48
49
51
52
53
55
56
57
59
60
61
63
64
65
67
68
69
71
72
73
75
76
77
79
80
81
83
84
85
87
88
89
91
92
93
95
96
97
99
100
ps:去除奇数后的打印结果
0
4
8
12
16
20
24
28
32
36
40
44
48
52
56
60
64
68
72
76
80
84
88
92
96
100
代码实现
#include<bits/stdc++.h>
using namespace std;
bool mark[105];
int r,l;
// 打表找规律
void find(){
for(int i=0;i<=100;i++){
for(int j=0;j<=100;j++){
for(int z=0;z<=100;z++){
if(!mark[i]){
if(i%2) continue;
if(i == j*j - z*z){
cout << i << endl;
mark[i] = true;
}
}
}
}
}
}
int main(){
// find();
cin >> l >> r;
int ji = (r +1) /2; //奇数个数
int ji_f = (l-1+1) / 2;
int si = r / 4; // 1到 r
int si_f = (l-1) / 4;//1到l - 1
cout << ji - ji_f + si - si_f;
return 0;
}
参考资料及相关链接