总结
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;
}
遇到复杂的判定条件,或者遇到根据不同情形来计算的值,就声明一个函数来处理;