WUSTOJ:n个素数构成等差数列

2023-12-17 07:32

本文主要是介绍WUSTOJ:n个素数构成等差数列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WUSTOJ:n个素数构成等差数列

Time Limit: 1 Sec
Memory Limit: 128 MB
64bit IO Format: %lld

Description

有n个素数(均小于m)可以构成一个等差数列。请编写程序根据给定的n和m,统计出满足条件的解有多少种。

例如,n=3,m=10;即在1到10的范围内有3个素数构成等差数列的情况有几组解,很显然3,5,7是一组解,也是唯一的一组。

提示:main函数已经给出(如下所示),提交时不必提交下面的代码,只需要提交你自己添加的代码。

#include<stdio.h>
int main()
{
int n,m,t;
while(scanf("%d%d",&m,&n)!=EOF)
{
t=f(m,n);
printf("%d\n",t);
}
return 0;
}

Input

包含多组测试数据,每组测试数据占一行,每行2个正整数,分别代表n和m,其中n大于等于3且小于等于10,m小于等于1000。

Output

每组测试数据输出占一行,每行输出一个整数,即满足条件的解的组数。

Sample Input
3 10

Sample Output
1

作答

选用C语言作答

分析

  1. 因为数据有界,首先可以把1000以内的素数进行打表,利用数组存储,节省计算时间。
  2. 在查找的过程中一定牵扯到遍历的方法,要选取适当的方法减少计算时间。
  3. 通过查询可知1000以内的素数共有168个,这里我将a[0]=0是为了数组的下标和素数相对应。并且可以得出结论等差数列的公差d最大为997-2=995(以首位素数差当作界点的最大公差)。项数为3,公差最小的等差数列为(3,5,7),此时公差为2。整个过程中满足,2<=d<=995,压缩d的取值区间。
int a[169]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
  1. 利用数组下标表示素数,用(0,1)区分是否为素数
int b[1001];for(i=1;i<=1000;i++)b[i]=0;for(i=1;i<=168;i++)b[a[i]]=1;
  1. 使用while语句进行状态读取,即‘ 0 ’为非素数,‘ 1 ’为素数,并且沿顺序继续读取下去。同时在扫描素数的时候,可以减少最后一组等差数列判断,即只扫到169-m即可。
  2. 因为要求的等差数列有项数要求,所以用计数器,我这里用的是count。
  3. 题目的m,n有点混乱,注意辨析。

源码

int f(int m,int n)
{int a[169]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};int i;int b[1001];for(i=1;i<=1000;i++)b[i]=0;for(i=1;i<=168;i++)b[a[i]]=1;int j,count,d,sum=0;for(i=1;i<=169-m;i++){d=2;while(d<=995){count=0;j=a[i];while(b[j]==1 && j<=n){if(count<m)count++;if(count==m){sum++;break;}j += d;}d++;}}return sum;
}

ps:在c语言的情况下,这个思路出奇的相同(通过和学长的交流知道)。如果有更好的,不超时的,ac过的代码,欢迎来踹我。

这篇关于WUSTOJ:n个素数构成等差数列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503592

相关文章

上海市计算机学会竞赛平台2024年8月月赛丙组等差数列的素性

题目描述 给定三个整数 nn,aa 与 dd,表示一个项数为 nn 的等差数列,首项为 aa,公差为 dd。 请统计,从这个等差数列中有多少数字是素数 输入格式 三个整数: nn,aa 与 dd 输出格式 单个整数:表示素数数量 数据范围 50%50% 的数据,1≤n≤10001≤n≤1000100%100% 的数据,1≤n≤100001≤n≤100001≤d≤10001≤d≤10

js算法判断是否为素数

/*判断一个数字是否是质数: 质数(prime number)又称素数,有无限个。除了1和它本身以外不再被其他的除数整除。*/ function isPrime(number){ //判断输入是否为number类型,是否为整数       if (typeof number!=='number'||!Number.isInteger(number))      {

【时时三省】c语言例题----华为机试题< 查找组成一个偶数最接近的两个素数>

山不在高,有仙则名。水不在深,有龙则灵。                                                                         ----CSDN 时时三省 1,题目 HJ60 查找组成一个偶数最接近的两个素数 描述 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个

题目:求100以内的素数,全部打印出来。

题目:求100以内的素数,全部打印出来。 public class ZhaoSuShu {public static void isPrime1(){int i,j,count = 0;//System.out.println("2");for(i = 1; i <= 100; i++){for(j = 2; j <= i; j++){if(i % j == 0){break;}}if(j ==

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i

Java-计算素数

判断输入的数字是不是素数: public class SuShu{public static void main(String[] args){java.util.Scanner s=new java.util.Scanner(System.in);int i=s.nextInt();boolean isSuShu=true; //标记;for(int j=2;j<i;j++){if(i%j=

常见素数筛法

列出几种常用的素数筛选法,附上计时器。。。 #include<cstdio>#include<cstdlib>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<algorithm>#include<cstring>#include<string>#inclu

【编程基础C++】素数判定、最小公倍数与最大公因数的实现方法

文章目录 素数法一法二 最大公因数辗转相除法另一写法 最小公倍数直接枚举法根据GCD算LCM 素数 素数 是指大于1的自然数,且只能被1和自身整除。例如,2、3、5和7都是素数。它们在数学中非常重要,因为任何大于1的自然数都可以唯一地表示为素数的乘积,这被称为素数分解。 法一 #include <iostream>using namespace std;bool IsPr

计算机网络:URL构成

计算机网络:URL构成 一、本文内容与前置知识点1. 本文内容 二、URL基本构成1. 协议2. 主机3. 端口4. 路径 四、参考文献 一、本文内容与前置知识点 1. 本文内容 URL构成说明。 二、URL基本构成 参考《计算机网络》6.4.2统一资源配置符URL p723 <协议>://<主机>:<端口>/<路径> 1. 协议 顾名思义,也就是协议名称,现在

求素数的几个方法(最朴素版、n*sqrt(n)版、埃氏筛、欧拉筛)

最朴素版O(n^2) #include <bits/stdc++.h>using namespace std;int n, cnt, prim[6000000];bool flag; //true 表示质数int main(){scanf("%d", &n);for(int i=2; i<=n; ++i){flag=true; //默认为质数for(int j=2; j<=i-