其他分享
首页 > 其他分享> > 【题解】单纯质因数

【题解】单纯质因数

作者:互联网

题目描述

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

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

        聪明爱动脑筋的楠楠突然对具有互不相同的质因数的合数产生了兴趣。例如:30=2∗3∗530=2∗3∗5,它有互不相同的质因数;70=2∗5∗770=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;
}
参考程序

 

标签:int,题解,质数,单纯,MAX,质因数,合数
来源: https://www.cnblogs.com/kcn999/p/10352332.html