入门算法 - 质因数分解

内容同步于我的博客:https://blog.bigrats.net/archives/basic-alg-prime-factors.html

题目描述

输入一个正整数,按照从小到大的顺序输出它的所有质因数

输入描述

输入一个long类型的整数

输出描述

按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

示例

Input:

180

Output:

2 2 3 3 5 

问题分析

我们首先应该知道,对一个正整数N来说,如果其存在除1和本身外的其他因数,那么必然会在N的平方根左右成对出现。根据这个原理,我们可以分析得出,N最多只存在一个大于sqrt(N)的质因数。

算法描述

  1. 枚举从2到sqrt(N)的所有质数fac,判断fac是否为N的因数;
    • 若fac为N的因数,则输出一次fac,并将N除以fac,得到新的N,重复此步骤直到fac不是N的因数为止
    • 若fac不是N的因数,则跳过
  2. 在枚举结束后,若N依然不为1,则说明原N有且仅有一个大于sqrt(原N)的质因数,直接输出此数即可。

代码

#include <cstdio>
#include <cmath>

using namespace std;

bool isPrime(int num) {
    int sqr = (int)sqrt(num);
    if(num == 1) return false;
    for(int i = 2; i <= sqr; i++) {
        if(num % i == 0) return false;
    }
    return true;
}

int main(int args, char* argv[]) {
    long inpnum;
    
    while(scanf("%ld", &inpnum) != EOF) {
        long uplimit = (long)sqrt(inpnum);
        for(long fac = 2; fac <= uplimit; fac++) {
            if(isPrime(fac)) {
                while(inpnum % fac == 0) {
                    printf("%ld ", fac);
                    inpnum /= fac;
                }
            }
        }
        if(inpnum != 1) {
            printf("%ld ", inpnum);
        }
        printf("\n");
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,313评论 0 19
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,909评论 0 2
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,165评论 0 41
  • 内容为个人原创,希望大家支持一下。 微信公众号:夜读小酒馆 最适合的朋友即使很久不见,坐下来就能一起吃火锅,问好也...
    夜读小酒馆阅读 1,378评论 0 0
  • 请输入正文。现在开始讲解。今天我们去了四季分享农庄。今天我和肖汉臣不至于和高凌飞来砍甘蔗砍甘蔗的时候不小心砍到了腿...
    橙子哥阅读 203评论 0 0