请将不超过2000的所有素数从小到大排成第一行,第二行上的每个素数都等于它右肩上的素数之差。编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898

原题:名字好像叫“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"; (滑稽。

 

 

 

 

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值