首页 > 其他分享 >Bug -- 线性筛素数

Bug -- 线性筛素数

时间:2023-03-11 11:24:32浏览次数:45  
标签:get -- ++ st int 素数 取整 primes Bug

发现 bug 的题目

bug 代码

void get_primes(int n)
{
    for(int i = 2; i < n; i ++ )
    {
        if(!st[i])  primes[idx ++ ] = i;
        for(int j = 0; primes[j] < n / i ; j ++ )  // (1)
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0)  break;
        }
    }
}

看起来人畜无害的样子,甚至还在 \((1)\) 将乘法变为除法防止溢出。但其实,问题就出现在这里!
除法,是可能不能整除的!如果不能整除,\(C\)++ 默认下取整
又因为,我们的比较符号是小于等于,这就导致下取整得到的结果我们取不到了!
所以,在下面的 st[primes[j]*i]=true; 中,我们就会少判断了一些 primes[j]
因为下取整导致循环提前结束掉了!
但是防止溢出却是是个好技巧,我们不能丢弃了,那怎么办呢?上取整即可。
此时小于上取整的结果,等价于小于等于下取整的结果。

正确代码

如果我们 \(n\) 除 \(k\) 时希望上取整,将 \(n\) 加上 \(k-1\) 即可。

void get_primes(int n)
{
    for(int i = 2; i < n; i ++ )
    {
        if(!st[i])  primes[idx ++ ] = i;
        for(int j = 0; primes[j] < (N + i - 1) / i ; j ++ )  // (1) 防溢出 + 上取整
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0)  break;
        }
    }
}

或者说,在判断时不要用小于,而是小于等于。

void get_primes(int n)
{
    for(int i = 2; i <= n; i ++ )    // (1) <=
    {
        if(!st[i])  primes[idx ++ ] = i;
        for(int j = 0; primes[j] <= n / i ; j ++ )  // (2) <=
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0)  break;
        }
    }
}

标签:get,--,++,st,int,素数,取整,primes,Bug
From: https://www.cnblogs.com/ALaterStart/p/17205518.html

相关文章

  • TypeScript tsconfig.json declaration All In One
    TypeScripttsconfig.jsondeclarationAllInOne.d.tstsconfig.json{"compilerOptions":{"declaration":true,"declarationDir":"./types"}}......
  • Codeforces Round 857 (Div. 2)(持续更新)
    Preface貌似CF的Div1/Div2分场就有1900的分界线,大号打不了Div2就很难受同时我对自己的水平有清晰的认知,现在打这种纯Div1的场肯定就是纯被虐,所以也不敢去Div1所以索性开......
  • Maven详细安装教程
    一.Maven简介1.1Maven由来a.我们在每次新建工程的时候,都需要引入一些jar包,可能产生一些问题或瑕疵   1.随着引入的jar包的增多,我们就不知道使用某个技术需......
  • 若依table显示图片
    在若依项目中使用预览图,并显示图片。<template><divclass="app-container"><el-form:model="queryParams"ref="queryForm"size="small":inline="true"v-sh......
  • 洛谷-2822
    洛谷-2652key思路有个modk的想法很好,然后就是对于一遍一遍的询问进行前缀和优化,但有个问题就是算出来的s矩阵最开始是个下三角矩阵,但是根据前缀和公式来看,s[i][j]上方......
  • webview注入js
    js中与webview通信functionsetStyle(){console.log('1111')returnfunction(){console.log('2222')try{console.log('3333')//隐藏图......
  • 数据库如何提升读写性能?
    以下是一些可以提升MySQL读性能的方法:使用索引:在查询频繁的列上创建适当的索引,可以大大提高查询速度。使用缓存:可以通过使用MySQL自带的查询缓存或者第三方缓存工具,如Me......
  • 冰雹数(模拟数的运算)
    题目描述任意给定一个正整数N,$$如果是偶数,执行:N/2如果是奇数,执行:N\times3+1$$生成的新的数字再执行同样的动作,循环往复。通过观察发现,这个数字会一会儿上......
  • C# 反射
    反射是一种在运行时动态获取程序类型信息的技术,它可以用来查找和操作程序中的类型、成员、属性和方法等。·以下是一个简单的利用反射查找、创建对象、调用方法、获取/修......
  • C#中的弱引用
    弱引用保持的是一个GC“不可见”的引用,是指弱引用不会增加对象的引用计数,也不会阻止垃圾回收器对该对象进行回收。因此,弱引用的目标对象可以被垃圾回收器回收,而弱引用本身......