2301_79584488 2024-02-21 17:35 采纳率: 80%
浏览 4
已结题

C语言代码解释,欧拉筛内容


#include <stdio.h>
 
const int MAXN = 1e6+500;
bool vis[MAXN];               // 筛选MAXN个素数
int prime[80000];             // 把素数依次存放在该数组中
int abQuJian[MAXN];
 
void isPrime()
{
    for (int i = 2; i < MAXN; i ++)
    {
        if ( !vis[i])
            #include <stdio.h>
 
const int MAXN = 1e6+500;
bool vis[MAXN];               // 筛选MAXN个素数
int prime[80000];             // 把素数依次存放在该数组中
int abQuJian[MAXN];
 
void isPrime()
{
    for (int i = 2; i < MAXN; i ++)
    {
        if ( !vis[i])
            prime[++prime[0]] = i;      // prime[0] --> 筛选出的素数个数
        for (int j = 1; j <= prime[0] && i <= MAXN/prime[j]; j ++)
        {
            vis[i*prime[j]] = 1;
            if (i % prime[j] == 0)
                break;
        }
    }
}
 
void solve()
{
    for (int i = 2; i < prime[0]; i ++)
    {
        int n = (prime[i]+prime[i+1])/2;
        abQuJian[n] = 1;
    }
    for (int i = 2; i <= MAXN; i ++)
        abQuJian[i] += abQuJian[i-1];
}
 
int main()
{
    isPrime();          // 欧拉筛
    solve();            // 前缀和
    int T,a,b;
    scanf("%d",&T);
    while ( T --)
    {
        scanf("%d %d",&a,&b);
        printf("%d\n",abQuJian[b]-abQuJian[a-1]);
    }
}    // prime[0] --> 筛选出的素数个数
        for (int j = 1; j <= prime[0] && i <= MAXN/prime[j]; j ++)
        {
            vis[i*prime[j]] = 1;
            if (i % prime[j] == 0)
                break;
        }
    }
}
 
void solve()
{
    for (int i = 2; i < prime[0]; i ++)
    {
        int n = (prime[i]+prime[i+1])/2;
        abQuJian[n] = 1;
    }
    for (int i = 2; i <= MAXN; i ++)
        abQuJian[i] += abQuJian[i-1];
}
 
int main()
{
    isPrime();          // 欧拉筛
    solve();            // 前缀和
    int T,a,b;
    scanf("%d",&T);
    while ( T --)
    {
        scanf("%d %d",&a,&b);
        printf("%d\n",abQuJian[b]-abQuJian[a-1]);
    }
}

这段代码里面prime(++prime(0))为什么要这么写啊,直接用一个变量计数不行吗如:peime(++i)不行吗

  • 写回答

1条回答 默认 最新

  • GISer Liu 2024-02-21 17:44
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    在这段代码中,prime[++prime[0]]这样的写法是为了在数组prime中存储素数,并且动态更新素数个数的计数器prime[0]。这种写法在C语言中比较常见,通过++prime[0]来实现先自增计数器,然后将素数存入数组中的下一个位置,以确保素数个数的准确记录。

    直接使用prime[++i]的写法也是可以的,但是需要额外维护一个i变量来记录当前应该存放素数的位置,相对而言稍显繁琐。而使用prime[++prime[0]]的写法,可以直接通过prime[0]的值来确定下一个应该存放素数的位置,简化了代码逻辑。

    总的来说,这种写法是为了简化代码逻辑,并且更直观地表达了“下一个素数应该存放在数组中的哪个位置”的意图。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月23日
  • 创建了问题 2月21日

悬赏问题

  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型