题解 | #质数因子#

质数因子

http://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607

质数因子【不超时,全通过】【详解】【源码】【c】

  1. 节省内存用链表存储,通过malloc()申请内存,注意引用<stdlib.h>库函数

  2. 素因子更新

    • 用于测试的质数每次至少增加2(除了factor==2的情况)(只考虑奇数)
    • 用于测试的质数要先通过素性测试,否则再次加2,直到其通过素性测试
  3. 因子判断及响应程序

    • 是因子,则更新待测数值,除以该因子,同时保证因子不变;
    • 不是因子,则更新素因子;
  4. 结束条件:当测试的质数大于N\sqrt{N}时,程序结束,同时记录最后一个待测数值作为最大的因子

结束条件很关键,尤其是在题设的最大数字情况下,如果从0~N全部遍历的时间会超出时限, 尽管我不希望见到开根号计算,但它能减少的计算量太多了

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

struct node{
    int value;
    struct node* next;
};

typedef struct node Node;

int odd_prime_test( int x)// 奇数素性测试
{
    int tmp = 3; // 初值为3,不考虑因子为2的情况
    int r = sqrt(x)+1;
    
    while(tmp<r)
    {
        if(x/tmp*tmp==x)
            return 0; // 返回0,代表合数
        else
            tmp+=2;
    }
    return 1; // 返回1,代表素数
}

int main()
{
    Node head;  // 申请连接头节点
    Node* p = &head; // 申请节点指针,指向头节点
    head.value = 1;
    head.next = NULL;
    int n;
    scanf("%d",&n);
    int factor = 2; // 素因子从2开始计数
    
    while( factor*factor <= n)
    {
        if((n/factor)*factor == n) // 是因子
        {
            n = n/factor; // 更新待测数字
            //factor = factor;
            
            p->next = (Node*)malloc(sizeof(Node));  // 链表后新加节点,存储因子       
            p = p->next;
            p->value = factor;
            p->next = NULL;
        }
        else // 不是因子,因数+2
        {
            if(factor==2)
                factor=3;
            else
            {
                factor += 2;
                while(!odd_prime_test(factor)) // 如果因子非素,则加2;直至因子为素
                {
                    factor += 2;               
                }
            }       
        }     
    }
    // 跳出循环,将剩余数字作为最后的因子;该因子必素
    p->next = (Node*)malloc(sizeof(Node));  // add node          
    p = p->next;
    p->value = n;
    // 输出
    p = (&head)->next;
    while(p)
    {
        printf("%d ",p->value);
        p = p->next;
    }
    
    
    return 0;
}``
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3136次浏览 43人参与
# HR最不可信的一句话是__ #
1021次浏览 32人参与
# 米连集团26产品管培生项目 #
7075次浏览 224人参与
# 春招至今,你的战绩如何? #
14766次浏览 137人参与
# AI面会问哪些问题? #
893次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2704次浏览 52人参与
# 巨人网络春招 #
11484次浏览 224人参与
# 沪漂/北漂你觉得哪个更苦? #
1235次浏览 38人参与
# 你做过最难的笔试是哪家公司 #
1131次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2684次浏览 49人参与
# XX请雇我工作 #
51147次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7966次浏览 43人参与
# 简历第一个项目做什么 #
32073次浏览 357人参与
# 简历中的项目经历要怎么写? #
310908次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152832次浏览 889人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187556次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64539次浏览 864人参与
# 如果重来一次你还会读研吗 #
229974次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178254次浏览 891人参与
# 你怎么看待AI面试 #
180654次浏览 1296人参与
# 正在春招的你,也参与了去年秋招吗? #
364172次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160822次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务