程序4---分解质因数

来源:互联网 发布:大数据公司排名 编辑:程序博客网 时间:2024/06/05 14:59

分解质因数就是将一个合数分解成几个质数(也叫素数)的乘积的形式。
如: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;}

这里写图片描述
这个时间显然无法接受啊。

0 0
原创粉丝点击