质数因子

质数因子_牛客网

这题有点麻烦,两步判断:是不是因子,是不是质因子

判断是不是质数:LeetCode第 204 题:计数质数(C++)_zj-CSDN博客
也可以看:判断一个数是不是质数(素数),3种方式介绍_阿飞的博客-CSDN博客

一些偶数的情况可以直接略过

#include 

using namespace std;

bool isprime(int n){//判断n是不是质数
	if (n <= 3)    return n > 1;
	if (n % 6 != 1 && n % 6 != 5)    return false;//不在6两侧的数一定不是质数
	for (int i = 5; i*i <= n; i += 6){
		/*
		此时的 num 确定是 6x+1 或者 6x-1 ,那么直接用 6x 左右的数字去除这个数(左边 = 6x-1,右边 = (6x-1)+ 2),
		能够整除则一定不是素数
		*/
		if (n%i == 0 || n%(i + 2) == 0)    return false;
	}
	/*
	for (int i = 6; i*i <= n; i += 6){//这样也是可以的
		if (n%(i-1) == 0 || n%(i + 1) == 0)    return false;
	}
	*/
	return true;
}

int main(){
	long num;
	cin >> num;
	while (num % 2 == 0){
		cout << 2 << " ";
		num /= 2;
	}
	while (num > 1){//最后一定会等于1
		for (int i = 3; i <= num; i += 2){
			if (num%i==0 && isprime(i)){
				cout << i << " ";
				num /= i;//更新num
				break;
			}
		}
	}
	return 0;
}

但是其实想复杂了,判断质数那一步是多余的。。。

对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印即可。
(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

#include 

using namespace std;

int main(){
	long n;
	cin >> n;
	for(int i = 2; i <= n; ++i){
        while(n%i == 0){
            cout << i << " ";
            n /= i;
        }
    }
	return 0;
}

其实这个方法看似简单,但是得仔细想想才能明白其中得原由,重点在于那个while循环,一定得是while才行。

你可能感兴趣的:(牛客题)