原题:名字好像叫“1898-要发就发”:请将不超过2000的所有素数从小到大排成第一行,第二行上的每个数都等于它右肩上的素数之差。
编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假好存在的话,又有几种这样的情况?
第一行:2 3 5 7 11 13 17……1979 1987 1993
第二行:1 2 2 4 2 4…… 8 6
其实网上也有很多题解,看了一圈就是要求的N位数不一样,有1993的,有2000的;(我看的作业是2000,用2000写,tips:反正不管时间,思路怎么来就怎么来。
答案 后面给思路
#include <bits/stdc++.h>
using namespace std;
bool is(int n)
{
if(n<2)
{
return false;
}
for (int i =2;i<n;i++)
{
if(n%i==0){return false;}
}
return true;
}
int a[2000],b[2000];
int main(int argc, char const *argv[])
{
for (int i = 0; i < 2000; i++)
{
a[i]=0;b[i]=0;
}
int c=0;
for (int n=2;n<2000;n++)
{
if(is(n))
{
a[c]=n;
c++;
}
}
for(int i=0;i<c;i++)
{
cout << a[i] << " ";
}
cout << endl;
int sum=0,num=0;
for(int j=0;j<c-1;j++)
{
b[j]=a[j+1]-a[j];
printf("%d ", b[j]);
}
cout << endl;
for (int i =0;i<c;i++)
{
for (int j=0;j<c;j++)
{
if ((a[j]-a[i])==1898)
{
num++;
printf("%d %d\n",a[i],a[j]);
}
}
}
printf("%d", num);
return 0;
}
纯C版本:
#include <stdio.h>
bool is(int n)
{
if(n<2)
{
return false;
}
int i;
for (i =2;i<n;i++)
{
if(n%i==0){return false;}
}
return true;
}
int a[2000],b[2000];
int main(int argc, char const *argv[])
{ int i;
for (i = 0; i < 2000; i++)
{
a[i]=0;b[i]=0;
}
int c=0;
int n;
for (n=2;n<2000;n++)
{
if(is(n))
{
a[c]=n;
c++;
}
}
for(i=0;i<c;i++)
{
printf("%d ", a[i]);
}
printf("\n ");
int sum=0,num=0;
int j;
for(j=0;j<c-1;j++)
{
b[j]=a[j+1]-a[j];
printf("%d ", b[j]);
}
printf("\n ");
for (i=0;i<c;i++)
{
for (j=0;j<c;j++)
{
if ((a[j]-a[i])==1898)
{
num++;
printf("%d %d\n",a[i],a[j]);
}
}
}
printf("%d", num);
return 0;
}
从题目看,我们需要解决N以内的素数。
素数判断之前写过,上链接https://blog.csdn.net/2301_80278223/article/details/134678293
核心就是对(n%i)的判断;
头文件你们自己来,C语言的记得把cin>>和cout<<该成scanf和printf
不要太懒,只抄答案可不好
bool ss(int n)
{
if(n <= 1){
cout<<n<<"不是素数"<<endl;
return 0;
}
for (int i = 2; i <sqrt(n); i++)
{
if ((n % i) == 0){
cout<<n<<"不是素数"<<endl;
return 0;
}
}
cout<<n<<"是素数"<<endl;
return 1;
}
int main() {
int a;
cin >> a;
ss(a);
return 0;
}
判断素数并输出,然后用数组存,至于数组的大小,如果不是算法题,就跟N一样吧,反正N以内的素数一定小于等于N。然后就是输出第一行。
第二行的要求就是第二行的第n等于第一行的第n+1位数减去第n位数。即为b[i]=a[i+1]-a[i]。
最后要求是求第二行是否存在一段连续的数相加为1898。一开始考虑复杂了,
想想看,第二行不就是第一行得出的吗。
第二行做了啥?取差值OWO!
一般正常做下来又还要循环两层,挨个的看第二行几到几是符合条件的。
但是前面说了第二行是第一行相邻数的差值,所以用数组存第二行没有必要
得出素数后直接两层循环if((a[j]-a[i])==1898)
for (int i =0;i<c;i++)
{
for (int j=0;j<c;j++)
{
if ((a[j]-a[i])==1898)
{
num++;
printf("%d %d\n",a[i],a[j]);
}
}
}
printf("%d", num);
所以你的答案其实可以不用出一大堆数
然后又是几到几符合1898,最后输出4。
而是cout<<"4"; (滑稽。