题解单纯质因数

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解单纯质因数相关的知识,希望对你有一定的参考价值。

题目描述

        读五年级的楠楠刚学完了质数、合数、因数、质因数等概念。

        他还知道了每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,叫做这个合数的质因数。把一个合数用质因数相乘的形式表示出来,叫做分解质因数。

        聪明爱动脑筋的楠楠突然对具有互不相同的质因数的合数产生了兴趣。例如:30=23530=2∗3∗5,它有互不相同的质因数;70=25770=2∗5∗7,它也有互不相同的质因数。若一个合数中所有的质因数互不相同,则把它称之为具有单纯质因数的合数。他想知道还有哪些数是单纯质因数的合数。

        你现在要帮楠楠解决的问题是:已知N,依次输出N以内所有具有单纯质因数的合数。

 

输入输出格式

输入格式

        一行,一个整数N。(10≤N≤100000)

 

输出格式

        一行,依次输出N以内所有具有单纯质因数的合数。

 

输入输出样例

输入样例

12

 

输出样例

6 10

 

题解

        我们可以先枚举出范围内所有质数,在根据这些质数构造出不具有单纯质因数的合数。

技术图片
#include <iostream>
#include <cstdio>

#define MAX_N 100000

using namespace std;

int n;
int p[MAX_N | 1], cnt;
int f[MAX_N | 1];
int w[MAX_N | 1];

int main()
{
    scanf("%d", &n);
    int op = 0;
    for(register int i = 2; i <= n; ++i)
    {
        if(!f[i]) p[++cnt] = i;
        for(register int j = 1; i * p[j] <= n; ++j)
        {
            f[i * p[j]] = 1;
            if(!(i % p[j])) break;
        }
    }
    for(register int i = 1; i <= cnt; ++i)
    {
        if(p[i] * p[i] > n) break;
        w[p[i] * p[i]] = 1;
    }
    for(register int i = 2; i <= n; ++i)
    {
        if(w[i])
        {
            for(register int j = 1; j <= cnt; ++j)
            {
                if(i * p[j] > n) break;
                w[i * p[j]] = 1;
            }
        }
        else if(f[i])
        {
            if(op) putchar( );
            else op = 1;
            printf("%d", i);
        }
    }
    return 0;
}
参考程序

 

以上是关于题解单纯质因数的主要内容,如果未能解决你的问题,请参考以下文章

欧拉计划第3题题解

题解 CF58B Coins

《算法零基础》第12讲:因子和题解

题解 P2626 斐波那契数列(升级版)

CodeForces 1047C Enlarge GCD(数论)题解

Codeforces Round #483 (Div. 1) 简要题解