算法 求一个数的质因数

题目描述

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

最后一个数后面也要有空格

详细描述:

函数接口说明:

public String getResult(long ulDataInput)

输入参数:

long ulDataInput:输入的正整数

返回值:

String

输入描述:

输入一个long型整数

输出描述:

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

示例1

输入

复制

180

输出

复制

2 2 3 3 5

思路:  1、2开始整除能除尽则是质因子  2、因为质因数顾名思义,即是质数也是因数,那么我们可以从2-sqrt(n)+1,求出其中的质数,然后以此判断能否被n整除。

#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <map>
using namespace std;

string GetData(long index)
{
  int i = 2;
  string ResStr = "";
  while(index>=2){
    if(index%i==0){
       ResStr+=to_string(i)+" ";
       index/=i;
     }
    else{
      i++;
      }
     }
  return ResStr;
}

int main() {
  long n;
  cin>>n;
  cout << GetData(n) << endl;
  return 0;
}

参考:https://blog.csdn.net/little_girl_ly/article/details/80139092

原文地址:https://www.cnblogs.com/liuruoqian/p/11644785.html

时间: 2024-10-28 21:49:23

算法 求一个数的质因数的相关文章

算法 - 求n个数的中位数(C++)

placeholder算法 - 求n个数的中位数(C++),布布扣,bubuko.com

用算法求N(N&gt;=3)之内素数的个数

首先,我们谈一下素数的定义,什么是素数?除了1和它本身外,不能被其他自然数整除(除0以外)的数 称之为素数(质数):否则称为合数. 根据素数的定义,在解决这个问题上,一开始我想到的方法是从3到N之间每个奇数进行遍历,然后再按照素数的定义去逐个除以3到 根号N之间的奇数,就可以计算素数的个数了. 于是便编写了下面的代码: (代码是用C++编写的) #include<iostream> #include <time.h> using namespace std; #define N 1

小算法:求一个数的乘方 - 使用递归

1 /** 2 * 求一个整数的乘方 3 * @param num 要乘方的数字 4 * @param power 多少次方 5 * @return 6 */ 7 public static int power(int num,int power){ 8 if(power == 1){ 9 return num; 10 } 11 if(power % 2 == 0){ 12 return power(num, power / 2) * power(num, power / 2); 13 }els

快速求出n!的质因数的个数

一般做组合数的题目都要进行质因数的分解,我们一般是for循环对每个数进行质因数分解,大多数情况都不会超时,但极少数的情况下,题目会不允许这样的做法,所以我们需要学会一种更快的方法来求质因数. 我们一般的方法是对每个数进行质因数分解: inline void calc(int x,int val) { int xx=x; for(int i=2;i*i<=xx;i++) { while(x%i==0)//不断进行除法,找出多少的当前的质数 { c[i]+=val;x/=i; } if(x==1)b

求两个数的最大公约数(Euclid算法)

求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证明:见 http://blog.csdn.net/niushuai666/article/details/7278027 public class Euclid{ // recursive inplementation public static int gcd(int p, int q){ if(q =

一天一个算法:求俩个数的最大公约数和最小公倍数

求俩个数的最大公约数和最小公倍数 解答: 当较大数除以较小数余数等于0时,较小数为最大公约数. 两数相乘结果除以它们的最大公约数为最小公倍数. int cdivisor(int x1,int y1) { int r,temp; if (x1<y1) { temp =x1; x1 = y1; y1 = temp; } while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数 { r=x1%y1; x1=y1; y1=r; } return y1; } int cmultipl

求N个数的最大公约数和最小公倍数

除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表示a1,a2,..,an的最大公约数,其中a1,a2,..,an为非负整数.对于两个数a,b,有[a,b]=ab/(a,b),因此两个数最小公倍数可以用其最大公约数计算.但对于多个数,并没有[a1,a2,..,an]=M/(a1,a2,..,an)成立,M为a1,a2,..,an的乘积.例如:[2,

如何防范算法求逆

假如您不幸遇到对Win32应用环境有足够了解的对手,以至于您的软件最终还是被凶悍的调试器任意蹂躏.但是您还远没有被打败,如果反调试技术(Anti-Debug)作为软件保护的第一道防线已经失守,您的对手只不过是掌握了一大堆汇编代码而已,毕竟代码和算法之间还是有相当距离的,所以您还有第二道防线可守--抗分析.在这道防线里,您有很多办法可以限制破解者掌握您的加密算法,从而阻止注册机或者破解补丁的出现. 一.前言 软件保护的目的是只向合法用户提供完整的功能,所以软件保护必然要包括验证用户合法性的环节,而

数学:求一个数的真约数(因数)的个数及所有约数之和

一. 我们知道,每个自然数(不包括0和1)都有2个以上的因数,因数最少的是质数(也叫素数),质数的因数是1和它本身.非质数的自然数也叫合数,它们都含有3个以上(含3个)的因数. 1.怎样求一个数有多少个因数? 对于一个已知的自然数,要求出它有多少个因数,可用下列方法: 首先将这个已知数分解质因数,将此数化成几个质数幂的连乘形式,然后把这些质数的指数分别加一,再相乘,求出来的积就是我们要的结果. 例如:求360有多少个因数. 因为360分解质因数可表示为:360=2^3×3^2×5,2.3.5的指