矜(bai)持(gei)的云拏 2022-10-29 14:17 采纳率: 81.3%
浏览 35
已结题

关于超时的问题,如何解决?

Interprime
题目描述
n是两个连续的奇素数的平均值,且n不是素数,那么我们称这样的数是"内部素数"。求区间[a,b]内"内部素数"的个数。比如,前5个"内部素数"是4,6,9,12,15。

输入
第一行是样例数T(1≤T≤1000)。 每个样例一行,为三个整数a,b(1≤a≤b≤106)。

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

样例输入
5
1 10
1 100
1 1000
1 10000
1 100000
样例输出
3
24
166
1228
9591

问题:我该如何优化这个代码,现在是超时了的
时间要求是1s,空间要求不需要管

//连续的(奇数&&素数)/2=一个内部素数==下标,其值为1
//SUM【】是前缀和
#include <bits/stdc++.h>
using namespace std;
int no_prime[1000001]={0};
int sum[1000001]={0};
int interprime[1000001]={0};
int jiprime[1000001]={0};
int main(){
    int t;
    cin>>t;
    no_prime[0]=no_prime[1]=1;
    int i,j;
    for(i=2;i<1000001;i++)
        if(!no_prime[i])
            for(j=i*2;j<1000001;j+=i)
                no_prime[j]=1;
    //打素数表
    for(i=1;i<1000001;i+=2)
        if(!no_prime[i]) jiprime[i]=1;
    //内部素数表
    for(i=1;i<1000001;i+=2){
        for(j=i+2;j<1000001;j+=2){
            if(jiprime[i]&&jiprime[j]){
                interprime[(i+j)/2]=1;
                break;//保证连续,一有就跳出
            }
        }
    }
    sum[3]=sum[2]=sum[1]=0;
    for(i=4;i<1000001;i++){
        sum[i]+=sum[i-1]+interprime[i];
    }
    
    while(t--){
        int a,b;
        cin>>a>>b;
        cout<<sum[b]-sum[a-1]<<endl;
    }
    
    return 0;
    
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-29 16:10
    关注
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月1日
  • 创建了问题 10月29日

悬赏问题

  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送