XTU OJ Prime twins

31 篇文章 2 订阅

Prime Twins

Submit Code ] [ Top 20 Runs ] [ Runs Status ]
Acceteped : 2041Submit : 6022
Time Limit : 1000 MSMemory Limit : 65536 KB

Description

题目描述

如果n和n+2都是素数,我们称其为孪生素数,比如3和5,5和7都是孪生素数。 给你一个区间[a,b],请问期间有多少对孪生素数?

输入

第一行是一个整数K(K≤ 10000),表示样例的个数。 以后每行一个样例,为两个整数,a和b,1≤a≤b≤5000000。

输出

每行输出一个样例的结果。

样例输入

5 
1 3 
1 10 
1 100 
1 1000 
1 5000000

样例输出

0 
2 
8 
35 
32463

思路分析:这道题主要就是要打表(标记素数,标记孪生素数,记录每个数前面到底有多少个孪生素数) 

#include<stdio.h>
int arr[5000001] = { 0 };
//用来标记所有的孪生素数
int brr[5000001] = { 0 };
int main() {
//开始打表
	//我们定义0是素数,1为非素数;
	arr[0] = 1;
	arr[1] = 1;
	for (int i = 2; i <= 5000000; i++) {
		if (arr[i] == 0) {//==0就代表没有被遍历过,就说明该数一定是素数
			for (int j = 2 * i; j <= 5000000; j += i) {
				arr[j] = 1;
			}
		}
	}
	//打表完成,已经标记了5000000中的所有素数
	//记录每一个数字前面有多少个孪生素数;
	for (int i = 2; i <5000001; i++) {
		brr[i] += brr[i - 1];//记录前面的一个数的前面有多少个孪生素数并把其交给下一个数
		if (arr[i] == 0 && arr[i + 2] == 0) {
			brr[i+2]++;//如果3是素数,且5是素数,就代表5前面存在一个孪生素数。就++
		}
	}
	int k;
	scanf("%d", &k);
	while (k--) {
		int a, b;
		int count = 0;
		scanf("%d %d", &a, &b);
		count = brr[ b] - brr[a+1];//这里用a+1能过,但a不能过,不知道为什么
		printf("%d\n", count);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值