Distinct primes factors
The first two consecutive numbers to have two distinct prime factors are:
14=2×715=3×5
The first three consecutive numbers to have three distinct prime factors are:
644=2^2×7×23645=3×5×43
646=2×17×19
Find the first four consecutive integers to have four distinct prime factors. What is the first of these numbers?
不同的质因数
首次出现连续两个数均有两个不同的质因数是在:
14=2×715=3×5
首次出现连续三个数均有三个不同的质因数是在:
644=22×7×23645=3×5×43
646=2×17×19
首次出现连续四个数均有四个不同的质因数时,其中的第一个数是多少?
这个题目要找连续的4个数同时都有4个不同的质因子的第一个数,那么我们将问题开始分析:
1.如何求一个数的质因数个数
分析过后只有这一个要求,那么对分析后的结果在进行分析如何去解决:
1.先求得一个范围的质数(线性筛)
2.通过每个质数从1-n(n * 质数小于上面的范围)开始乘得到这个质数在这个范围里的每个数,用数组存起来+1,那么最终可以得到每个数有多少个质因数;
举个例子 30 = 2 * 15 那么2标记一次+1 现在30的质因子个数为1
30 = 3 * 10 那么3标记一次+1 现在30的质因子个数为2
30 = 5 * 6 那么5标记一次+1 现在30的质因子个数为3
最终得到30的质因子个数为3个;
通过上面对思路过后那这个题也就有了清晰的思路了,下面开始将思路转为代码:
#include <stdio.h> #define MAX_N 200000//所求的范围,如果没有就往上加 int prime[MAX_N + 5]; int isprime[MAX_N + 5]; int num[MAX_N + 5]; void init() {//初始化线性筛 for (int i = 2; i <= MAX_N; i++) { if (!isprime[i]) prime[++prime[0]] = i; for (int j = 1; i * prime[j] <= MAX_N; j++) { isprime[i * prime[j]] = 1; if (i % prime[j] == 0) break; } } } int main() { init(); for (int i = 1; i <= prime[0]; i++) {//初始化每个数的质因子的个数 if (2 * prime[i] > MAX_N) break; for (int j = 1; j * prime[i] <= MAX_N; j++) { num[j * prime[i]] += 1; } } for (int i = 2; i <= MAX_N; i++) {//求连续4个数的质因子都为4个 if (num[i] != 4) continue; if (num[i + 1] != 4) continue; if (num[i + 2] != 4) continue; if (num[i + 3] != 4) continue; printf("%d\n", i); break; } return 0; }
最终答案:134043