问题三十:现将不超过1993的所有素数从小到大排成一行,第二行为第一行左肩与右肩之差,例如:
第一行:2 3 5 7 11 。。。
第二行: 1 2 2 4 。。。
求第二行是否存在若干连续整数恰好是1898,请举出全部情况
/*
题目三十:现将不超过1993的所有素数从小到大排成一行,第二行为第一行左肩与右肩之差,例如:
第一行:2 3 5 7 11 。。。
第二行: 1 2 2 4 。。。
求第二行是否存在若干连续整数恰好是1898,请举出全部情况
分析:这是一道综合题,借助数组更加方便 ,同时也可以等价为第一行存在多少个素数之差为1898
给出两种方式,等价转换后的速度更快
*/
#include<iostream>
#define MAX 2000
using namespace std;
int su_shu(int n){
int i;
if (n == 0||n == 1)return 0;
for(i=2;i<=(n>>1);i++){
if(n%i == 0) return 0;
}
return 1;
}
int* shu_zu(){
int i,j,k=0;
int count = 0;
int first[MAX],second[MAX];
for(i=0;;i++){
for(j=k;j<=1993;j++){
if(su_shu(j) == 1){
first[i] = j;
k = j+1;
break;
}
}
if(j == 1994)break;
}
for(j=0;j<i-1;j++){
second[j] = first[j+1]-first[j];
count++;
}
return second;
}
int main(){
//题目三十
int i,j,k=0;
int count = 0,count_first = 0;
int first[MAX],second[MAX];
for(i=0;;i++){
for(j=k;j<=1993;j++){
if(su_shu(j) == 1){
first[i] = j;
k = j+1;
count_first++;
break;
}
}
if(j == 1994)break;
}
for(j=0;j<i-1;j++){
second[j] = first[j+1]-first[j];
count++;
}
//方法一,依照题目直接做出
int total = 0,a=0;
for(i=0;i<count;i++){
total = 0;
for(j=i;j<count;j++){
if(total < 1898){
total += second[j];
}
if(total == 1898){
a++;
for(k=0;k<=j-1;k++){
cout<<second[k]<<" + ";
}
cout<<second[k]<<" = 1898"<<endl;
break;
}
if(total > 1898){
break;
}
}
}
cout<<a<<endl;
//方法二,使用等价结果进行
/*
int a = 0;
for(i=0;i<count_first;i++){
for(j=i;j<count_first;j++){
if(first[j]-first[i] == 1898){
cout<<first[j]<<" - "<<first[i]<<endl;
a++;
break;
}
if(first[j]-first[i] > 1898)break;
}
}
cout<<a<<endl;
*/
return 0;
}
这其中有不合适或者不正确的地方欢迎指正,我的QQ号码:2867221444(乔金明),谢谢,也可以相互交流下,备注信息随意,只要能看得出是开发者或者学习者即可。