总结:
1、一般用ans表示全局值;用p或者tmp表示临时值;
2、二维数组的第一维,代表纵坐标;第二维代表横坐标,因此,二维数组的dir[y][x]和坐标系中(x, y)正好是相反的
int dir[4][2] = { //用方向数组来控制方向;
{-1, -1}, {-1, 0}, {-1, 1}, {0, 1},
}
3、用方向数组来控制方向;
总结:
1、一般用ans表示全局值;用p或者tmp表示临时值;
2、二维数组的第一维,代表纵坐标;第二维代表横坐标,因此,二维数组的dir[y][x]和坐标系中(x, y)正好是相反的
int dir[4][2] = { //用方向数组来控制方向;
{-1, -1}, {-1, 0}, {-1, 1}, {0, 1},
}
3、用方向数组来控制方向;
总结:
1、将当前数组里的第i个字符,转换成一个整型!
num[i] -= '0';
2、循环读入,可以跳过换行符,把一系列数字读进一个数组中;
while (~scanf("%s", num + len)) len += strlen(num + len);
总结:
1、线性筛是一个很有趣的算法!来用最大素因子的唯一性,有限度地对倍数进行合数标记;
总结:
1、初始化函数,通常我们用void init() {}来写;
2、素数筛标记这是第几个素数的写法;
prime[++prime[0]] = i
总结
1、O(n) → O(logn)之间的复杂度区别就是,枚举遍历和二分查找之间的区别。
总结:
1、最小公约数的写法!
int gcd(int a, int b) {
return (b ? gcd(b, a % b) : a);
}'
总结
1、学会估算循环条件的上界;
2、应用位数的“条件反射写法”,当位数上有内容的时候
while(x) {
tmp ......
x /= 10;
}
第一圈,对角线只有1,
第二圈,对角线有3 1 7 5 9
1、边长的规律:第n圈的矩阵变长为m = 2 *n - 1
第一圈边长为1;第二圈变长为3;第三圈变长为5;
2、矩阵右上角的值:m * m
3、剩下4个角落的值分别为:m * m - m + 1, m * m - 2m + 2, m * m - 3m + 3
4、每一圈上四个角的值相加和为:4m * m - 6m + 6
总结:
1、推公式,是最快的。
总结:
1、O(1)就是直接用公式一步计算出最后的答案!这是最快的!直接推导出平方和公式,累加的平方公式。
总结:
1、return tmp == n,在一些情况下,可以直接将判断条件进行返回,而不用写
if(...) return
return
2、生成翻转数字的关键代码:
tmp = tmp * base + x % base
x /= base
总结:
1、宏定义的时候,如果是长整形,要在数字后面加LL
#define N 6000851475143LL
2、如果N(M = N)为合数,M最后除完所有约数,最后应该为1;否则,M则为素数;
总结:
1、滚动数组最大的利用价值是可以反复运用同一个空间。(类似于循环队列)
总结:
1、灵活利用反函数,可以在相互赋值的时候,省略一个中间变量c——b = a + b; a = b - a;
2、很多有递推关系的累加或者累乘,都可以避免开数组储存,只需要一边计算一边添加即可;
总结:
1、要学会估算数组所需要的最小上界
2、给关键值,上限值,特殊值,定义名字,是一个良好的写作习惯,方便阅读理解;
3、开辟数组的时候,多开辟3 - 5个,也是一个良好地习惯;
4、if(fib[i] & 1) 如果是奇数,则....
总结:
1、可以将判断条件封装成函数!
2、一步到位的算法,就是比遍历条件判断来的要快得多!
如果这是100万,100亿,10兆,那么挨个遍历,然后进行条件判断的过程,其结果等同于运算3个数学式子后的结果。
这就是,证明得到相应数学性质的威力!
#include using namespace std; #define N 600851475143LL int main(){ long long i = 2, num = N; while(i * i <= num){ if(num % i == 0) num /= i; i++; } cout << num << endl; } //感觉这是最简洁的
素数筛:
第10001个素数不会超过二十万
void init() {
for(int64_t i = 2; i < max_n; i++) {
if(prime[i]) continue;
prime[++prime[0]] = i;
for(int64_t j = i * i; j < max_n; j += i) {
prime[j] = 1;
}
}
}
素数筛的代码
第四行可以将素数进行排序