文章目录
卷一:数学知识准备篇
数学归纳法
- 证明P(1)
- 假设P(k)正确 --> 证明P(k+1)
- 证毕,P(n)正确
数学归纳法与程序设计
-
循环累加求和
-
递归求阶乘
-
HZOJ-236
递归实现组合型枚举oj.haizeix.com
int main(){
int sum = 0;
for(int i = 1; i <= 100; i++){
sum += i;
}
cout << sum << endl;
return 0;
}
int f(int n){
if(n == 1) return 1;
return n * f(n - 1);
}
int main(){
cout << f(5) << endl;
return 0;
}
void output(int n, int m, int p, vector<int> &buff){
//从n个数字中选m个数字,p:当前可以选择的最小数字
//buff:当前已经选的数字
if(buff.size() == m){
for(int i = 0; i < m; i++){
if(i != 0) cout << " ";
cout << buff[i];
}
cout << endl;
return;
}
//buff数量不足m的情况
for(int i = p; i <= n; i++){
buff.push_back(i);//继续添加元素
output(n, m, i + 1, buffer);//继续往下递归调用,达到m就输出一种方案
//输出结束后,把不应该存在buff末尾的元素删除
buff.pop_back();
}
return;
}
int main(){
int n, m;
cin >> n >> m;
vector<int> buff;
output(n, m, 1, buff);
return 0;
}
了解数学归纳法平时更多的是为了保证程序设计的正确性,即使是复杂程序设计也一样。
初等数论基础
素数筛算法
//define MAX_N 10000
int prime[MAX_N + 5] = {0};
//被标记的i为1,没被标记为0
void init_prime(){
for(int i = 2; i * i <= MAX_N; i++){
if(prime[i]) continue;//i被标记了就继续
//用j把i的倍数都标记
for(int j = i * i; j <= MAX_N; j += i) prime[j] = 1;
}
//prime[0]:记录的是表中素数的个数 prime[0]前面存的是素数表,后面存的是标记信息
for(int i = 2; i <= MAX_N; i++){
//把所有素数整理到prime前半段
if(prime[i] == 0) prime[++prime[0]] = i;
}
return;
}
int main(){
init_prime();
cout << "total prime : " << prime[0] << endl;
int x;