分解质因数就是将一个合数分解成几个质数(也叫素数)的乘积的形式。
如:6=2*3
第一种实现
基本思路:
从i=2到sqrt(n),遍历,如果n%i==0,则表示i是n的一个因子,然后再看这个i是不是素数(即质数),如果是,则打印,并使n = n/i。然后i再从2开始。
bool isPrime(int m)
{
int sqr = sqrt(m);
for(int i=2; i <= sqr; i++)
{
if(m%i == 0)
return false;
}
return true;
}
void foo(int n)
{
for(i=2; i <= sqrt(n); i++)
{
if(n%i == 0)
{
if(isPrime(i))
{
print("%d ", i);
n = n / i;
i = 1; //到了下次循环,就是2了。
}
}//if(n % i == 0)
}
printf("%d", n);
}
第二种实现,优化
第一种实现,代码写的太复杂。
(1)由于从2开始整除的,没有必要判断被n整除的这个数是不是质数,这个数必然是质数。
(2)没有必要每次都从2开始。因为,已经从2开始过了,如果上一次循环时,n都不能被2整除,则后面的肯定不会被2整除。
#include <stdio.h>
#include <math.h>
void foo(long long int n)
{
long long int sqr = sqrt(n);
long long int i = 0;
for(i = 2; i <= sqr; i++)
{
if(n % i == 0 && (n /= i))
{
printf("%lld ", i--);
}
}
if(n != 1)
{
printf("%lld", n);
}
printf("\n");
}
int main()
{
long long int n = 9223372036854;
scanf("%lld", &n);
foo(n);
return 0;
}
这个时间显然无法接受啊。