素因子分解(递归求解)

简介: 素因子分解(递归求解)

描述:


给定某个正整数 N,求其素因子分解结果,即给出其因式分解表达式


N = p1k1 * p2k2… pmkm


输入:

输入long int范围内的正整数N。

输出:

pi由小到大输出,当ki==1时可以直接输出pi。


思路:

一个典型的递归求解问题,注意特判输入的数为‘1’即可;


#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const ll maxx = 1e18;
const int N = 1e6+100;
const int p = 1e4;
const double eps = 1e-8;
ll k;
ll judge(ll n)
{
  if(n<2) return 0;
  for(ll i=2;i<=n/i;i++)
    if(n%i==0)
      return 0;
    return 1;
}//判断素数 
void Prime(ll n)
{
  if(n==1) return ;//递归函数跳出条件,分解到 1 就结束 
  int cnt=0;
  for(int i=2;;i++)
  {
    if(n%i==0&&judge(i)==1)//是素因数 
    {
      cout<<i;//输出这个数 
      while(n%i==0)
      {
        cnt++;
        n/=i;
      }//找相同的数的个数 
      //相同的数个数直接用一个while循环来找,没必要再调用递归 
      if(cnt==1)
      {
        if(n!=1)
          cout<<"*";
      }//没有相同的输出乘号,注意判断这个数不是最后一个数 
      else
      {
        if(n==1)
          cout<<"^"<<cnt;
        else
          cout<<"^"<<cnt<<"*";
      }//有相同的输出幂次和乘号,注意判断是不是最后一个 
      break;
    }
  }
  Prime(n);//再次调用 
}
int main()
{
  cin>>k;
  cout<<k<<"=";
  if(k==1)//特判 1 
  {
    cout<<k;
    return 0;
  }
  else
    Prime(k);//调用函数 
  return 0; 
}


反思:


相同的数个数直接用一个while循环来找,没必要再调用递归,节省时间


目录
相关文章
|
6月前
递归求解汉诺塔问题(超详解)
递归求解汉诺塔问题(超详解)
|
算法 C++ 异构计算
|
算法
算法提升 (四) 递归
算法提升 (四) 递归
134 0
算法提升 (四) 递归
|
算法
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
100 0
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
|
算法 程序员
算法之递归
算法之递归
105 0
算法之递归
|
机器学习/深度学习 算法
斐波拉契数列的递推递归求解算法
斐波拉契数列的递推递归求解算法
113 0
递归求解汉诺塔问题
博主之前有写过关于递归问题的思维模式: [递归的思路](https://blog.csdn.net/qq_43575801/article/details/124029190?spm=1001.2014.3001.5501) 下面将用这种思维模式来求解经典汉诺塔问题。
137 0
递归求解汉诺塔问题
|
算法 容器
递归树:借助树来求解递归算法时间复杂度
递归树与时间复杂度分析 我们前面讲过,递归的思想就是,将大问题分解为小问题来求解,然后再将小问题分解为小小问题。这样一层一层地分解,直到问题的数据规模被分解得足够小,不用继续递归分解为止。 如果我们把这个一层一层的分解过程画成图,它其实就是一棵树。我们给这棵树起一个名字,叫作递归树。我这里画了一棵斐波那契数列的递归树,你可以看看。节点里的数字表示数据的规模,一个节点的求解可以分解为左右子节点两个问题的求解。
268 0
递归树:借助树来求解递归算法时间复杂度