要保证每一组质数的等差数列尽可能的大
这是小花最近在练题的时候看到的一道题,搜了答案感觉都不是很好懂,所以我就自己写了一个c语言版有注释的,希望能帮到大家呀
下面是代码:
void main() {
int n, m, s = 0;
int sushu[100];
int middex[100][3];//存储每个公差,和它的开始和结束元素
int mid;//公差
int midshu=0;//公差的个数
printf("请输入两个整数a、b(范围为a~b):\n");
scanf("%d %d", &n, &m);
//求质数并用数组sushu存储
for (int i = n; i <= m; i++) {
if (i == 2 || i == 3) {
sushu[s++] = i;
}
else if (i == 1)
continue;
else {
int j;
for (j = 2; j <= sqrt(i); j++) {
if (i % j == 0)
break;
}
if (j > sqrt(i))
sushu[s++] = i;
}
}
//打印质数数组
printf("%d到%d质数为:\n", n, m);
for (int i = 0; i < s; i++)
printf("%d\t", sushu[i]);
printf("\n");
//求有多少质数构成等差数列
for (int i = 0; i < s - 1; i++) {
for (int j = i + 1; j < s; j++) {
mid = sushu[j] - sushu[i];
int k;
int cin = 2;//在mid的等差里数列的个数
int start = sushu[i];//开始元素
int begin = sushu[j];//结束元素
for (k = j + 1; k < s; k++) {
if (sushu[k] - begin == mid) {
begin = sushu[k];
cin++;
}
else if (sushu[k] - begin > mid)
break;
}
if (cin > 2) {
for (k = 0; k < midshu; k++)
if (mid == middex[k][0] && begin == middex[k][2])
break;
if (k < midshu)
continue;
middex[midshu][0] = mid;
middex[midshu][1] = start;
middex[midshu++][2] = begin;
}
}
}
//打印等差数列的公差和开始、结束元素
printf("公差\t开始元素\t结束元素\n");
for (int i = 0; i < midshu; i++) {
printf("%d\t%d\t\t%d\n", middex[i][0], middex[i][1], middex[i][2]);
}
printf("等差数列的个数为%d", midshu);
}
下面是运行成功的图片: