求一个整数的最大质因数(回答一个群友的问题)

[QQ群:
189191838,对算法和C++感兴趣可以进来]

群里最近每天都聊得很嗨,虽然不一定是技术,更多的是生活,还是非常开心。因为工作、程序只是我们生命中的一小部分,人的幸福与否,更多的由人的业余生活和他的精神世界所决定。和一群陌生的人,扯扯淡,毫无压力的聊聊人生觉得也挺好。

好的,直接奔入主题。情况是这样的,群里有位同学问了一道算法,求一个整数的最大质因数。然后他给出了代码(如下所示),但是测试没有通过。


 1 int largest_prime_factor(int n)
2 {
3 while (n >1)
4 {
5 for(int i=2;i<=n;i++)
6 {
7 if(n%i==0)
8 {
9 n = n/i;
10 break;
11 }
12 return n;
13 }
14 }
15 }

第一反应是觉得这个算法肯定是会有些问题的,比如说当n=9时,直接就返回9了。

仔细思考了一下,发现,这真是一个巧妙的解题思路,只不过没有控制好边界条件罢了。改正后:


 1 int largest_prime_factor(int n){
2 if (n<1){//
3 return -1;
4 }
5 if (n==1){//判断边界条件
6 return 1;
7 }
8 while (n >1){
9 for(int i=2;i<=n;i++){
10 if (n==i){//到达n了,就没有继续的必要了,已经最大
11 return n;
12 }
13 if(n%i==0){//
14 n = n/i;
15 break;
16 }
17 }
18 }
19 }

自己测试过,没有问题。

其实,当我第一次看到这道题的时候,我的思路是两个for循环。但是好像没有上面的效率高。代码如下:


bool isZhiSu(int n){//是否是质数,是质数返回true
for(int i=2;i<n;i++){
if (n%i==0){
return false;
}
}
return true;
}
int largest_prime_factor2(int n){
if (n<1){
return -1;
}
for (int i=n;i>=1;i--){
if (n%i==0&&isZhiSu(i)){//判断是否能被N整除,并且是质素
return i;
}
}
}

一道质数求解的题目,其实也有很多技巧。哇嘎嘎。。。

版权所有,欢迎转载,但是转载请注明出处:潇一

求一个整数的最大质因数(回答一个群友的问题),布布扣,bubuko.com

时间: 2024-10-26 13:12:59

求一个整数的最大质因数(回答一个群友的问题)的相关文章

在10万以内判断,一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数,求该数

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 的结果满足如下条件,即是结果. 程序源代码: #include<stdio.h> #include<math.h> int main() { long int i, x, y; for (i = 1; i<100000; i++) { x = sqrt(i + 100); y = sq

给定一个整数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

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int sum=nums[0];//当前遍历到的最大和的子集 4 int max=nums[0];//数组的最大和 5 for(int i=1;i<nums.length;i++){ 6 sum=sum>0?(sum+nums[i]):n

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

题目:质因数分解,给定一个整数,求该数的所有质因数,例如 90 = 2*3**3*5. 首先,质数的定义(引用百度百科): 质数又称素数,有无限个.一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除(除0以外)的数称之为素数(质数):否则称为合数.根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积:而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的. 在自然数域内,质数是不可再分的数,是组成一切自然数的基本元素. 比如,10 是由两个

求一个整数的位数

C++ 吧里看到有人求助, 说是想写点代码求一个整数的位数, 以下是我的解决方法: int32_t RecursionIter (const int64_t& num, const int32_t& result) { if (num < 0) { return RecursionIter (-num, result); } else if (num / 10 == 0) { return result; } else { return RecursionIter (num / 10

一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数

4个字节表示的整数,总共只有2^32约等于4G个可能.为了简单起见,可以假设都是无符号整数.分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0.基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的.算法流程:1)分配500MB内存buf,初始化为02)unsigned int x=0x1;  for each int j in file  buf=buf|x<<j;  e

求一个整数的二进制中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 假设该整数为i.首先i和1做与运算,判断i的最低位是不是为1.接着把1左移一位得到2,再和i做与运算,就能判断i的次高位是不是1……这样反复左移,每次都能判断i的其中一位是不是1.基于此,我们得到如下代码 int NumberOf1_Solution(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(

28.求任意一个整数的十位上的数字

#include<iostream> using namespace std; int main() { int i,j,n; cout<<"please input an number :"<<endl; cin>>n; if(n/10<1) { cout<<0; }else { i=n/10; j=i%10; cout<<j; } return 0; } 28.求任意一个整数的十位上的数字

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:首先最先想到的是遍历从1到n的每个数,判断每个数中包含1的个数,再相加. 时间复杂度:如果输入数字为n,n有O(logn)位,我们需要判断每个数字的每一位是不是为1,所以时间复杂度为O(n*logn).如果输入数字很大的时候,就需要大量的计算,效率不高. 接下来观察规律: 从个位到最高位,我们判断每一位1出现的次数.比如 对于数2