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

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

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

总结

1、判断数字是否有重复,我们可以开一个数组,看数字对应下标位置是否为1,来判断;类似于标记合数;

这里有两处:

①判断a, b, a * b是否有重复数字:

    while (n) {

        if (num[n % 10]) return 0;                             

        num[n % 10] += 1;

        n /= 10;

    }

//长度为11的数组,每个数字挨个求10的模的时候,如果该对应下标位置上不为0,说明此前已经有余数为其赋值1了,因此这个数字重复了;

②判断a * b是否有重复数字:

int keep[max_n + 5] = {0}

 

            if (keep[a * b]) continue;

            sum += a * b;

            keep[a * b] = 1;

//长度为(a * b的上限+5)的数组,如果a * b位置上不为0,说明此前已经有a * b为其标记过了,因此这个a * b重复了;

2、求位数的函数,记得添加头文件,这个要记下来

#include <math.h>

 

int digits(int n) {

    if (!n) return 1;

    return floor(log10(n)) + 1;

}

3、求最大公约数的函数,也要记下来

#include <tinttypes.h>

 

int gcd(int32_t a, int32_t b) {

    if (!b) return a;

    return gcd(b, a % b);

}

4、和素数有关的一个整体解题结构大概是:

#include <stdio.h>

#include <int32_t.h>

#include <inttypes.h>

 

#define max_range ....

 

int32_t isPrime[max_range + 5] = {0};        //判断是否是素数

int32_t prime[max_range + 5] = {0};          //记录素数数组,用于遍历素数

 

void initprime(int n) {

    线性筛

    ......

}

 

void is_val(int n) {

    循环素数?;

    可截素数?;

    ......

}

 

void solve() {

    遍历素数数组:prime[i]

    判断是否is_val

    return 累加或者累乘的结果

}

 

int main() {

    init

    int many = solve()

    printf("%d\n", many);

    return 0;

}

遇到复杂的判定条件,或者遇到根据不同情形来计算的值,就声明一个函数来处理;

[展开全文]

授课教师

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

课程特色

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