回 帖 发 新 帖 刷新版面

主题:[讨论]从一个帖子中的因子分解想到的问题

这个算法来自:
[url]http://bbs.pfan.cn/post-287959.html[/url]

[quote][code=c]
#include <stdio.h>
#include <math.h>
int main(void)
{
    int n, nsq;
    scanf("%d", &n);    // 输入要分解的n
    while( n % 2 == 0)  // 先试除2
    {
        n /= 2;         // n中去掉2这个因子
        printf("2,");   // 输出因子2
    }
    nsq = (int)sqrt((double)n); // 记录平方根的结果
    for(int n1=3; n1<=nsq; )    // n1用于试除
    {
        if(n % n1 == 0)         //判断n除以n1的余数是不是为0
        {
            printf("%d,", n1);  // 输出这个因子
            n /= n1;            // n中去掉n1这个因子
            nsq = (int)sqrt((double)n); // 重新记录平方根的结果
        }
        else    // 除不尽的话,加一试下一个数
        {
            n1+=2;
        }
    }
    if    ( n != 1  )  printf( "%d,",n );
    printf( "\b \b" ); 
   
    return 0;
}
[/code] [/quote]

这个算法很优秀.

回复列表 (共6个回复)

沙发

不错

板凳

lz的探讨精神,赞~~

for (  i=3; n > 1;    ) 
        {
        if ( !(n%i) && (n/=i) )
              printf( "%d*",i )    ;   
        else if ( (i+=2)>q ) break ;
        }//for i=3...  
其实吧,lz前面写过i=3了,这里可以直接while(n>1)了
这种代码也有缺点,就是过度精炼导致调试起来很耗精力,可重用性降低

3 楼

 

4 楼

我一直在思考每轮重新计算平方根和直接穷举之间到底哪个时间复杂度比较高

5 楼

[quote]我一直在思考每轮重新计算平方根和直接穷举之间到底哪个时间复杂度比较高[/quote]

  这也是我一直在想的问题。每轮重新计算平方根和直接穷举感觉各有优势,考虑平均情况不知道哪个好些。还有下面两个情况我也没能想清:
   1.要不要每次检验n是否已经等于1:有些情况不检验要比检验好很多。
   2.是每轮计算平方根还是每次计算平方根:如果每轮计算一次平方根的话,那么每次就多 n % n1 != 0 这样的检验;但如果某个因子的出现的次数比较多的话,如要将3^15分解因式,每轮计算一次的话只要15次判断上述式子和一次调用sqrt函数,而每次计算的话要调用15次sqrt函数。

6 楼

看帖回帖^_^

我来回复

您尚未登录,请登录后再回复。点此登录或注册