| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3238 人关注过本帖
标题:一道时间超限的题,求帮忙优化
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 18楼 xzlxzlxzl
其实求10^9开平方范围内的数就可以了~
因为一个数如果包含了至少一个重复的质因子,那么它肯定可以被某个质数的平方整除~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-19 10:44
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用九转星河在2018-5-19 10:38:03的发言:

事实上打表求区间范围会更加有优势(当然,说了等于没有说)
求单个数当然没有必要打表~
但线性筛求质数很明显是线性的,多于1个数的时候第二个数开始就可以用到表了~

其实17楼的说明还是忽略了一个问题,就是建表的时间,找10^5以内的质数遍历10^5次就可以了,弄得我重新看了一遍~

PS:然后我重新理解你所说的,一句话就是:用表求区间段素数可以在线性时间复杂度里面完成,上面就是个例子~

函数里面的循环是2到n
求质数的循环也是2到n
这句话的意思其实是
求质数表 循环次数在10^5之内
函数内部的2到n 其实也是在10^5之内的
注意循环内部不停修改n的
所以我说没提升

不过你说的重复使用 这个我倒没注意到
这个想法很好 很有效 我写写看

https://zh.
2018-05-19 11:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这个代码就是简单寻找某个数是否有重复因子出现的可以看看~

程序代码:
#include<stdio.h>

#define MAX 40001
char isPrime[MAX+1];
int prim[MAX+1];
int primSqre[MAX+1];

int main( void )
{
    int i=0;
    int j=0;
    int num=0;
    int data[2];
    
    scanf("%d",&data[0]);//输入一个数作为检查数据

    for (i=2;i<=MAX;++i)
    {
        if (!isPrime[i])
            prim[num++]=i;

        for (j=0;j<num&&i*prim[j]<=MAX;++j)
        {
            isPrime[i*prim[j]]=1;

            if (i%prim[j]==0)
                break;
        }
    }

    for (i=0;i<num;++i)
        primSqre[i]=prim[i]*prim[i];

    for (data[1]=data[0];;)
    {
        for (j=0;j<2;++j)
        {
            for (i=0;i!=num&&(data[j]%primSqre[i])&&primSqre[i]<=data[j];++i);
            
            if (i!=num&&primSqre[i]>data[j])
            {
                printf("%d\n",data[j]);
                                                    
                j=3;
            
                break;
             }        
          }
          
        if (j==3)
            break;
        
        if (data[0]>2)
            --data[0];           
        
         ++data[1]; 
    }

    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-19 12:14
快速回复:一道时间超限的题,求帮忙优化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050771 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved