海贼19-8班现场课
20569人加入学习
(0人评价)
编码能力训练课

0基础入门,突破欧拉50题

价格 ¥ 299.00
该课程属于 海贼19-8班(C++高薪班) 请加入后再学习

总结:

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;
        }
    }
}

素数筛的代码

第四行可以将素数进行排序

[展开全文]

授课教师

高级算法研发工程师
C++算法工程师

课程特色

视频(41)
文档(51)
图文(71)