素因子分解(递归求解)

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

描述:


给定某个正整数 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循环来找,没必要再调用递归,节省时间


目录
相关文章
|
8月前
|
6天前
递归求解汉诺塔问题(超详解)
递归求解汉诺塔问题(超详解)
|
算法 C++ 异构计算
|
机器学习/深度学习 算法
斐波拉契数列的递推递归求解算法
斐波拉契数列的递推递归求解算法
81 0
|
算法
算法提升 (四) 递归
算法提升 (四) 递归
110 0
算法提升 (四) 递归
|
算法
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
|
算法 程序员
算法之递归
算法之递归
84 0
算法之递归
递归求解汉诺塔问题
博主之前有写过关于递归问题的思维模式: [递归的思路](https://blog.csdn.net/qq_43575801/article/details/124029190?spm=1001.2014.3001.5501) 下面将用这种思维模式来求解经典汉诺塔问题。
113 0
递归求解汉诺塔问题
|
算法
递归+回溯求解数独问题
导读:回溯是常用的算法理论之一,很多规模较大、直接分析较为复杂的问题都可以考虑用回溯求解,例如N皇后问题、骑士周游和走迷宫问题等。本质上,回溯问题是一种优化后的暴力求解,通过及时的剪枝和启发式的寻找最优路径,可以有效加速求解过程。回溯还常常与递归搭配使用
133 0
递归+回溯求解数独问题