质数因子

本文介绍了一种高效的质因数分解算法,通过构建小于等于根号n的质数表来减少计算量,并提供了完整的C++实现代码。适用于快速找出一个正整数的所有质数因子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 ),最后一个数后面也要有空格。


输入描述:

输入一个long型整数


输出描述:

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


输入例子:
180

输出例子:
2 2 3 3 5


解题思路

首先根据long型整数num,产生一个素数表,表中的素数不超过sqrt(num),并且从小到大排列。因为超过sqrt(num)的素数最多只能有一个,所以可以单独判断这种情况,这样可以大大减小计算量。


根据这个素数表,判断num能否整除表中的各个素数。需要注意的是,num可以有多个同样的素数因子。当num不超过1或者素数表中元素都已经遍历过了,判断此时的num是否是素数,如果是,则表明有一个超过sqrt(num)的素数。


素性检验有多种方法,我这里用的是最简单的一种。


代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<string> getResult(long num); //返回long型整数的所有质因子
void print(const vector<string>& vecStr); //按规定格式打印结果
vector<long> primeTable(long num); //产生小于等于sqrt(num)的质数表
bool isPrime(long num); //判断是否是质数
string DecToString(long num); //将long型整数转化为字符串

int main()
{
    long num;
    cin >> num;
    
    vector<string> vecStr = getResult(num); //返回long型整数的所有质因子
    print(vecStr); //按规定格式打印结果
    
    return 0;
}


vector<string> getResult(long num) //返回long型整数的所有质因子
{
    vector<long> vec = primeTable(num); //产生小于等于sqrt(num)的质数表
    int i =  0;
    vector<string> vecStr;
    
    while (num > 1 && i < vec.size())
    {
        while (num > 1 && num % vec[i] == 0) //能整除质数vec[i]
        {
            vecStr.push_back(DecToString(vec[i]));
            num /= vec[i];
        }
        
        ++i;
    }
    
    if (isPrime(num)) //可能还有一个大于sqrt(num)的质数
    {
        vecStr.push_back(DecToString(num));
    }
    
    return vecStr;
    
}    
    
void print(const vector<string>& vecStr) //按规定格式打印结果
{
    for (string str : vecStr)
        cout << str << " ";
    
    cout << endl;
    
}

vector<long> primeTable(long num) //产生小于等于sqrt(num)的质数表
{
    vector<long> vec;
    for (long i = 2; i * i <= num; ++i)
    {
        if (isPrime(i))
            vec.push_back(i);
    }
    
    return vec;
}


bool isPrime(long num) //判断是否是质数
{
    if (num < 2)
        return 0;
    
    for (long i = 2; i * i <= num; ++i)
    {
        if (num % i == 0)
            return 0;
       
    }
    
    return 1;
}


string DecToString(long num) //将long型整数转化为字符串
{
    string str;
    
    while (num > 0)
    {
        str = static_cast<char>(num % 10 + '0') + str;
        num /= 10;
    }
    
    return str;
    
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值