zoukankan      html  css  js  c++  java
  • AlgorithmGossip (19) 完美数

    前言

    This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

    提出问题

    19.AlgorithmGossip: 完美数

    说明

    如果有一数n , 其真因数 (Proper factor ) 的总和等于n , 则称之为完美数(Perfect Number )

    步骤

    三个步骤:
    求出一定数目的质数表
    利用质数表求指定数的因式分解
    利用因式分解求所有真因数和,并检查是否为完美数

    分析和解释

    定位

    基础算法题, 不加赘述

    代码

    #include <stdio.h>
    #include <stdlib.h>
    #define N 1000
    #define P 10000
    int prime(int*); 
    int factor(int*, int, int*); // get factor
    int fsum(int*, int); // sum ot proper factor
    int main(void) {
        int ptable[N+1] = {0}; 
        int fact[N+1] = {0}; 
        int count1, count2, i;
        count1 = prime(ptable);
        for(i = 0; i <= P; i++) {
            count2 = factor(ptable, i, fact);
            if(i == fsum(fact, count2))
                printf("Perfect Number: %d
    ", i);
            }
        printf("
    ");
        return 0;
        }
    int prime(int* pNum) {
        int i, j;
        int prime[N+1];
        for(i = 2; i <= N; i++)
            prime[i] = 1;
        for(i = 2; i*i <= N; i++) {
            if(prime[i] == 1) {
                for(j = 2*i; j <= N; j++) {
                    if(j % i == 0)
                        prime[j] = 0;
                    }
                }
            }
        for(i = 2, j = 0; i < N; i++) {
            if(prime[i] == 1)
                pNum[j++] = i;
            }
        return j;
        }
    int factor(int* table, int num, int* frecord) {
        int i, k;
        for(i = 0, k = 0; table[i] * table[i] <= num;) {
            if(num % table[i] == 0) {
                frecord[k] = table[i];
                k++;
                num /= table[i];
                }
            else
            i++;
            }
        frecord[k] = num;
        return k+1;
        }
    int fsum(int* farr, int c) {
        int i, r, s, q;
        i = 0;
        r = 1;
        s = 1;
        q = 1;
        while(i < c) {
            do {
                r *= farr[i];
                q += r;
                i++;
                } while(i < c-1 && farr[i-1] == farr[i]);
            s *= q;
            r = 1;
            q = 1;
            }
        return s / 2;
        }

    拓展和关联

    后记

    参考书籍

    • 《经典算法大全》
    • 维基百科
  • 相关阅读:
    必懂的wenpack优化
    必懂的webpack高级配置
    webpack基础知识
    vue-cli
    codemirror使用
    js实现二叉树
    react-生命周期
    window 批量修改或去除文件后缀名
    十分钟搞清字符集和字符编码
    php判断一个值是否在一个数组中,区分大小写-也可以判断是否在键中
  • 原文地址:https://www.cnblogs.com/actanble/p/6713397.html
Copyright © 2011-2022 走看看