题目描述
2,3,5,7,11,13,… 是素数序列。 类似:7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 3030,长度为 66。
20042004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为 1010 的等差素数列,其公差最小值是多少?
代码
#include<iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL arr[30][30];
int main(int argc, const char* argv[]) {
// 输入数据放入二维数据
// 自上而下处理a[i][j]*factor(2的30次方) --> 计入a[i+1][j]和a[i+1][j+1]
//循环处理2~N-1行
//对a[N-1]这一行进行排序,查看最小值与factor之间的倍数关系,决定最大值是多少
//准备乘数
LL factor = 1;
for (int i = 0; i < 30; i++) {
factor <<= 1;
}
//输入二维数组
for (int i = 0; i < 29; i++) {
for (int j = 0; j <= i; j++) {
LL a;
scanf_s("%lld", &a);
arr[i][j] = a * factor;
}
}
for (int i = 0; i < 29; i++) {
for (int j = 0; j <= i; j++) {
LL ha = arr[i][j] / 2;
arr[i + 1][j] += ha;
arr[i + 1][j + 1] += ha;
}
}
sort(arr[29],arr[29]+30);
cout << arr[29][0]/2 << "," << arr[29][29] / 2 << endl;
return 0;
}