求1000000内的素数和每个数的因子的个数

1 求素树

   1 求解素树我们是利用筛法:对于不超过MAXN的每个整数x,我们只要去删除2x,3x,4x......,当处理完MAXN个数之后剩下的即为素数

   2 时间复杂度分析:外层为O(n),内层总的次数为小于n/2+n/3+n/4+......+n/n,那么总的O(nlogn)

2 求因子个数

   1 对于最大的值来说,我们只要枚举到sqrt(MAXN),然后我们对于每个i,去枚举j从(i+1, j*i<MAXN) , 这样我们求出

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 1e6;

int prime[MAXN];
int divide[MAXN];

// 求素树
void getPrime(){
    bool vis[MAXN];
    int pos = 0;
    memset(vis , false , sizeof(vis));
    for(int i = 2 ; i < MAXN ; i++){
        if(!vis[i])
           prime[pos++] = i;
        for(int j = i*2 ; j < MAXN ; j += i)
            vis[j] = true;
    }
}

// 求因子的个数
void getDivide(){
    int t = sqrt(MAXN*1.0);
    for(int i = 1 ; i <= t ; i++){
        for(int j = i+1 ; j*i < MAXN ; j++)
            divide[i*j] += 2; //i和j是不同的,因此加2
        divide[i*i]++; //i和i相同那么加1即可
    }
}

int main(){
    getPrime();
    getDivide();
    return 0;
}
时间: 2024-09-10 05:12:33

求1000000内的素数和每个数的因子的个数的相关文章

acm-区间筛法求区间内素数的个数

问题描述 区间筛法求区间内素数的个数 for(ll i = 2;i*i <=b;i++) is_prime_small[i] = true; for(ll i = 0;i <=b-a;i++) is_prime[i] = true; for(ll i = 2;i*i <=b;i++) { if(is_prime_small[i]) { for(ll j = 2*i;j*j <=b;j += i) is_prime_small[j] = false; for(ll j = max(2

我的Java开发学习之旅------&amp;gt;求N内所有的素数

一.素数的概念 质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数. 根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的.最小的质数是2 二.算法 算法1.  开根号法:如果一个数(>2),对这个数求平方根,如果这个数能被这个数的平方根到2之间的任何一个(只要有一个

Ruby、PHP、Shell实现求50以内的素数_ruby专题

ruby求50之内的素数的方法,感觉对比PHP和SHELL方法是最简单的,但SHELL中可以利用factor命令,而PHP中没有求素数的对应函数的,需要自己设计算法,三种方式大家对比学习下,应该还有更优更简单的方法的. 复制代码 代码如下: #encoding:utf-8 #求50以内的素数(注意数字中..与...的区别)   for i in 2..50 #1默认不为素数,所以从1-50范围内被排除     f=true #起始假定每个数都是素数     for p in 2...i #比自身

java求100之内的素数(质数)简单示例_java

质数又称素数.一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数:否则称为合数.根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的.下面是一个java求100之内的素数简单示例 复制代码 代码如下: public class test {  public static void main(String[] args) {  int i,n,k=0;     for (n = 3;

.net-C#.Net怎么求100以内的素数?

问题描述 C#.Net怎么求100以内的素数? C#.Net怎么求100以内的素数? Visua 2005环境? 解决方案 http://www.51testing.com/html/25/237925-232093.html 求采纳,谢谢 解决方案二: 代码http://zhidao.baidu.com/link?url=Ou2UF57bXZE_XaBUkZN-00294GQSf2ZhahMHI988ZsvFqahXbREyAS7mn2f-vtw1D8bZuoFBgppfEgMD7mLQWwB

编程题-如何在C#中用math.sqrt实现求200以内的素数?

问题描述 如何在C#中用math.sqrt实现求200以内的素数? 不用函数,用嵌套循环.始终没想明白怎么写................... 解决方案 using System;public class Test{ public static void Main() { for (int i = 2; i < 200; i++){ bool isp = true; for (int j = 2; j <= Math.Sqrt((double)i); j++) { if (i % j ==

算法实现-请问怎样求N阶方阵的不同行不同列的N个数之和最大,用算法如何实现?谢谢!

问题描述 请问怎样求N阶方阵的不同行不同列的N个数之和最大,用算法如何实现?谢谢! 请问怎样求N阶方阵的不同行不同列的N个数之和最大,用算法如何实现?谢谢! 解决方案 参考:http://bbs.csdn.net/topics/340023577 最大和最小思路其实类似

javascript 显示一定范围内的素数(质数)

素数又称质数,是大于1的自然数,并且只有1和它本身两个因数. 具体实现代码如下: 运行代码 <!DOCTYPE HTML> <html> <head lang="en"> <meta charset="UTF-8"> <script type="text/javascript" src="http://files.cnblogs.com/greenteaone/jquery-2.1.

制作u-boot的logo但是不加载lcd驱动的办法,求站内大神帮助!!

问题描述 制作u-boot的logo但是不加载lcd驱动的办法,求站内大神帮助!! 如题,仿照hawk的方式设置好了相关地址,hawk的logo能正常打印但是现在想换成自己的图片,由于hawk的logo是白色背景加指针的形式,小的刚开始研究u-boot,不知道怎么改,试过直接打印数组形式的图片但是打印出来的图片扭曲加变形色彩也不对但是打印全屏一个颜色却可以,搞得我头昏脑涨,所以希望各位大神能多多指点,小的在这里谢过了 解决方案 http://wenku.baidu.com/link?url=UZ