质因数分解(给定一个整数,求该数的所有质因数)

  题目:质因数分解,给定一个整数,求该数的所有质因数,例如
90 = 2*3**3*5。

  首先,质数的定义(引用百度百科):

  质数又称素数,有无限个。一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。

  在自然数域内,质数是不可再分的数,是组成一切自然数的基本元素。 比如,10 是由两个 2 和两个 3
组成的,正如水分子是由两个 H 原子和一个 O
原子组成的一样。只是和化学世界不同,质数有无穷多个,因此算术世界的元素也就有无穷多个。算术世界内的一切对象、定理和方法,都是由其基本元素质数组成的。

  所以,注意,最小的质数(素数是2),1既不是质数也不是合数。回到题目,求一个整数的所有质因数,我们举几个例子来分析问题。比如,数字9
= 3*3,再比如18 = 2*9 = 2*3*3。所以,求解的过程就是从i等于整数2开始搜索,看是否能整除n,如果n能够被一个素数整除,那么判断n/i的商是不是素数,如果不是素数,那么继续求商的所有质因数;如果商也是素数,那么所有的质因数都被找出来了,停止递归。

  下面贴代码,首先是判断一个数是不是素数的函数:


 1 bool isZS(int n)
2 {
3 int sqrtN = (double)sqrt((double)n);
4 if ( n==1 ) return true;
5 if ( n==2 ) return true;
6 if (sqrtN*sqrtN == n) return false;
7 for (int i=2;i<=sqrtN;i++)
8 {
9 if ((n%i) == 0 )
10 return false;
11 }
12
13 return true;
14 }

  然后是递归求解所有的质因数:


 1 void findAllZYS(int n)
2 {
3 if (n == 1)
4 {
5 cout<<1;
6 return ;
7 }
8 if (n == 2)
9 {
10 cout<<2;
11 return;
12 }
13 if (isZS(n))
14 {
15 cout<<" "<<n<<endl;
16 return;
17 }
18 int i = 2;
19 for (i=2;i<=n;i++)
20 {
21 if (isZS(i) && n%i == 0)
22 {
23 cout<<i<<" "<<endl;
24 break;
25 }
26 }
27
28 int nxtN = n / i;
29 if (isZS(nxtN))
30 {
31 cout<<nxtN<<" "<<endl;
32 return;
33 }
34 else
35 {
36 findAllZYS(nxtN);
37 }
38
39 }

  好了,上面就是我的思路和代码了,抛砖引玉~欢迎指点~~

时间: 2024-11-15 05:18:58

质因数分解(给定一个整数,求该数的所有质因数)的相关文章

给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数

1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 0101 故它的二进制权值为7(二进制表示中有7个1) 现在要求一个比N大,且最靠近N的数,且这个数的二进制权值与N相同.(这里不考虑Integer.MAX_VALUE 和负数情形.) 对于有符号的32位整数而言:它们的补码如下: Integer.MAX_VALUE= 0111 1111 1111 11

给定一个整数,求解该整数最少能用多少个Fib数字相加得到

一,问题描述 给定一个整数N,求解该整数最少能用多少个Fib数字相加得到 Fib数列,就是如: 1,1,2,3,5,8,13.... Fib数列,满足条件:Fib(n)=Fib(n-1)+Fib(n-2)   Fib(0)=1   Fib(1)=1:Fib数字,就是Fib数列中的某个数. 比如70 = 55+13+2,即一共用了3个fib数字得到 二,问题求解 ①求出所有小于等于N的Fib数字 //获得小于等于n的所有fib数 private static ArrayList<Integer>

给定一个整数数组,奇数位于偶数前面

两个指针,一个指向最前,一个指向最后,依次进行交换 代码: #include<iostream> using namespace std; //使奇数位于偶数前面 void reSort(int *pData,int length){ if(NULL == pData || length <= 0) return ; int *pBegin = pData; int *pEnd = pData + length -1; while(pBegin < pEnd){ //奇数向前移动

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数

题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.   你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.示例:给定 nums = [2, 7, 11, 15], target = 9返回 [0, 1] 思路: 第一层for循环从索引0到倒数第二个索引拿到每个数组元素,第二个for循环遍历上一层for循环拿到的元素的后面的所有元素. 具体代码: 1 public class Solution { 2 public int[] twoSum(int[] nums,

刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返

给定一个整数sum, 从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum

class FindClosestPairExample { public static void findAndPrintClosest(int[] arrayOne, int expectedSum) { int lenOne = arrayOne.length; //数组长度,默认全部填满. int diff = Integer.MAX_VALUE; //定义两数与期望值的差值:默认取最大整数 int resultOne = 0; //第一个元素 int resultTwo = 0; //

c#编程:给定一个正整数求出是几位数并逆序输出

<span style="color:#FF0000;">第一步:把输入的数字转为字符串n.ToString() 第二步:求出字符串的长度即为正整数的位数 第三步:从后向前逆序输出</span> 附代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; //给一个正整数, //要求:一.求它是几位数,二.逆序打印出各位数字. namespa

给定一个整数实现奇偶bit位互换

1.分别取出所有奇数bit位和偶数bit位 0x55555555(对应二进制奇数bit位为1,偶数bit位全为0)&num 0xaaaaaaaa(对应二进制即偶数bit位为1,奇数bit位全为0)&num 2.将奇数bit位的所有数字<< 1,偶数bit位的数字>> 1,然后做或(|)或者加操作,即有宏定义如下: #define EXCHANGE(num) (((0x55555555 & num) << 1) + ((0xaaaaaaaa &am

给定一个整数s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n)

//题目虽然简单,但是对于初学者来说,还是很有必要学习的 #include<stdio.h> int main(){ int n; int i; int sum = 0; float S = 0.0; scanf("%d",&n); for(i = 1;i<=n;i++){ sum += i; S += (float)1/sum; } printf("%f\n",sum); return 0; }