这是传说中的原题链接
分解质因数,这应该算是一道基础题,因为我感觉我从开始学习编程就经常见这样的题目,所以这次好好地总结一下(总不能到现在还要每次百度什么是质数这样的问题,好好总结!)------十分实用于初学者
先来解释几个名词概念
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;
}