码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】单纯质因数

时间:2019-02-04 23:21:42      阅读:917      评论:0      收藏:0      [点我收藏+]

标签:char   click   return   space   efi   strong   one   color   include   

题目描述

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

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

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

 

【题解】单纯质因数

标签:char   click   return   space   efi   strong   one   color   include   

原文地址:https://www.cnblogs.com/kcn999/p/10352332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!