求自然数素数因子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mingjieshendu/article/details/80957782

1.理论部分

1.1.素数

natural number (1, 2, 3, 4, 5, 6, etc.) is called a prime number (or a prime) if it is greater than 1 and cannot be written as a product of two natural numbers that are both smaller than it. (from Wikipedia)
如果一个自然数(如1, 2, 3, 4, 5, 6)大于1并且不能看作小于他的两个自然数的乘积,那么这个自然数称为一个素数(或质数)。
如:5=1×5 素数
6=2×3 非素数

1.2.素数因子

This (the fundamental theorem of arithmetic) theorem states that every integer larger than 1 can be written as a product of one or more primes. (from Wikipedia)
算数的基本定理表示:任何大于1的整数都可以看作一个或多个素数的乘积。
In number theory, integer factorization is the decomposition of a composite number into a product of smaller integers. If these integers are further restricted to prime numbers, the process is called prime factorization.(from Wikipedia)
数论中,整数因式分解是将合数分解成较小整数的乘积。如果将这些整数限制为素数的话,那么整个过程称为素数因式分解。
如:

这样的素数就称作整数的素数因子。

2.算法部分

2.1 问题

输入一个整数num,打印出整数num的所有素数因子。如输入num=48,输出为“2,2,2,2,3",输入num=49,输出为“7,7”.

2.2 算法步骤

1)记初始素数因子primeFactor=2,primerFactor的增加步长deltaVal=1;
2)进入for循环;
3)进入while循环,如果num能被primeFactor整除,打印primeFactor,num除以primeFactor再重新赋值,直到num 不能被primeFactor整除;
4)调整primeFactor,继续for循环,直到不满足循环条件。如果primeFactor=3,调整deltaVal=2;
5)最后根据num与primeFactor大小情况,决定是否打印最后的num。

2.3 代码实现

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void)
{
	int num, num2, primeFactor, deltaVal;

	num = num2 = 0;
	primeFactor = 2;
	deltaVal = 1;

	printf("please input a integer number(>=2): ");
	scanf("%d", &num);
	printf("prime factors are: ");
	num2 = (int)sqrt(num);
	for (; primeFactor <= num2; primeFactor += deltaVal)
	{
		while (num%primeFactor == 0)
		{
			printf("%d,", primeFactor);
			num /= primeFactor;
		}
		if (primeFactor == 3)
			deltaVal = 2;
	}
	if (num >= primeFactor)
		printf("%d,", num);
	
	printf("\b \n");//clear redundant comma
	system("pause");

	return 0;
}

分析:这里通过deltaVal调整primeFactor的大小,初始primeFactor=2,接下来素数因子可能为3,增量为1,所以设置deltaVal=1,后面的素数因子不可能为偶数,所以设置deltaVal=2,可减少不必要的计算。num2是初始num的开平方取整后的结果,并将primeFactor <= num2作为for循环的判断条件。原因在于每个合数都必然有一个素数因子不大于这个合数的算术平方根,即不存在两个素数因子都大于算术平方根的情况。如:n=a×b,如果a>√n且b>√n,那么a×b>√n×√n。最后num大于等于primeFactor,输出最后一个素数因子。

参考资料


猜你喜欢

转载自blog.csdn.net/mingjieshendu/article/details/80957782