算法提高 分解质因数

本文详细介绍了编程中常见的基础题——分解质因数。首先定义了质数和因数的概念,并强调1不是质数。接着,针对数字的三种情况(质数、合数、1)分别讨论了如何分解质因数。文章提供了C++代码实现,特别指出在处理合数时,通过不断除以质因数以避免合数因子的出现,同时利用平方根优化判断质数的时间复杂度。
摘要由CSDN通过智能技术生成

这是传说中的原题链接
分解质因数,这应该算是一道基础题,因为我感觉我从开始学习编程就经常见这样的题目,所以这次好好地总结一下(总不能到现在还要每次百度什么是质数这样的问题,好好总结!)------十分实用于初学者
先来解释几个名词概念
1、质数:大白话来讲就是除了1和它本身,再无其他的因数
不能有人问什么是因数吧?就是因子啦,可以被它整除的数
注意!!!!1可不是质数喔!
2、分解质因数:(我们总要知道题目的意思吧,要不然怎么做题~嘿嘿)
分解质因数就是把所给的数字分解成一些质数的乘积(只能是质数喔)
好了,基础打好了,现在开始了
我们的目标:把所给的数字分解成一些质数的乘积
所给的数字有几种情况呢(既然题目说到了质数,那我们自然就按他来分类咯):质数、合数(除了1和本身还可以有别的因子)、1。就这三种
那按情况来看:
当n为1时,很简单,就是输出1就好了,因为没别人了
当n为质数时,也很简单,它的因数只有1和本身,1又不是质数,所以直接输出它本身就好了
当n为合数时,才是我们真正要考虑的问题
我们的方法就是:让这个数从2开始,挨个除,如果除得尽,输出这个除数(因子),原始数据除以除数,再次除以这个除数,直到除不尽,除数才+1
敲黑板!!!!这里很重要喔,为什么要再次除以这个除数呢?其实这是为了保证因子里不要出现合数,举个例子就是 除2可除,除完了,往后走了,除4可除,4就被输出了,但是他可不是质数啊!那怎么办,前面除两次2,不就把这个4抵了嘛(好好想想喔,很重要)
还有一个问题呢,就是求他是否是质数,(这个也很重要,如果当前是质数了,后面就没必要了,直接输出它就结束了,减少时间复杂度)
至于怎么判断是质数,也很重要啦,时间复杂度要注意,用sqrt(n),可千万不要用n循环
看看代码吧~好好看注释!

#include <bits/stdc++.h>

using namespace std;
bool is_zhi(int n)//判断质数
{
    bool is_z=true;//标记值,用来标记是否为质数
    for(int i=2;i<=sqrt(n);i++)//循环上限:sqrt(n),减少时间复杂度
    {
        if(n%i==0)
        {
            is_z=false;
            break;
        }
    }
    return is_z;
}
int main()
{
    int n;
    cin>>n;
    if(is_zhi(n))//n是质数,直接输出
        cout<<n<<" ";
    else//n是合数
    {
        for(int i=2;i<n;i++)
        {
            if(n%i==0)
            {
                cout<<i<<" ";//除数当前因子
                n/=i;//基数除去已输出的因子
                i--;//这很重要!!!保证了还从当前因子判断,避免出现合数因子被输出
                if(is_zhi(n)||n==1)//边界
                {
                    cout<<n<<" ";
                    break;
                }

            }
        }
    }
    cout<<endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值