在本教程中,我们将讨论一个打印数字的程序,这样就不会有两个连续的数字是互素的,而每三个连续的数字都是互素的。
在这种情况下,我们将得到一个整数N,我们必须打印N个小于109的整数,这样就没有两个连续的数字是互质的,而一对3个连续的整数必须是互质的。
例如,假设我们有整数4。那么,以上两个条件都满足的数字是
6 15 35 14
#include <bits/stdc++.h>
using namespace std;
#define limit 1000000000
#define MAX_PRIME 2000000
#define MAX 1000000
#define I_MAX 50000
map<int, int> map1;
int b[MAX];
int p[MAX];
int j = 0;
bool prime[MAX_PRIME + 1];
void sieve(int n){
memset(prime, true, sizeof(prime));
for (int p = 2; p * p <= n; p++){
if (prime[p] == true){
for (int i = p * p; i <= n; i += p)
prime[i] = false;
}
}
for (int p = 2; p <= n; p++){
if (prime[p]) {
b[j++] = p;
}
}
}
int gcdiv(int a, int b){
if (b == 0)
return a;
return gcdiv(b, a % b);
}
//打印所需的系列
void print_elements(int n){
sieve(MAX_PRIME);
int i, g, k, l, m, d;
int ar[I_MAX + 2];
for (i = 0; i < j; i++){
if ((b[i] * b[i + 1]) > limit)
break;
p[i] = b[i];
map1[b[i] * b[i + 1]] = 1;
}
d = 550;
bool flag = false;
for (k = 2; (k < d - 1) && !flag; k++){
for (m = 2; (m < d) && !flag; m++){
for (l = m + k; l < d; l += k){
if (((b[l] * b[l + k]) < limit)
&& (l + k) < d && p[i - 1] != b[l + k]
&& p[i - 1] != b[l] && map1[b[l] * b[l + k]] != 1){
if (map1[p[i - 1] * b[l]] != 1){
p[i] = b[l];
map1[p[i - 1] * b[l]] = 1;
i++;
}
}
if (i >= I_MAX) {
flag = true;
break;
}
}
}
}
for (i = 0; i < n; i++)
ar[i] = p[i] * p[i + 1];
for (i = 0; i < n - 1; i++)
cout << ar[i] << " ";
g = gcdiv(ar[n - 1], ar[n - 2]);
cout << g * 2 << endl;
}
int main(){
int n = 4;
print_elements(n);
return 0;
}输出结果
6 15 35 14