算法day01 素数 完数

214 阅读1分钟
本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

1、从键盘输入一个整数,判断该数是否为素数

#include <stdio.h>

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if (num <= 1) {
        // 小于等于1的数不是素数
        printf("%d 不是素数\n", num);
    }
    else {
        int is_prime = 1;  // 默认为素数
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) {
                is_prime = 0;
                break;
            }
        }
        if (is_prime) {
            printf("%d 是素数\n", num);
        }
        else {
            printf("%d 不是素数\n", num);
        }
    }

    return 0;
}

  1. 首先定义一个整型变量 num 用于存储从键盘输入的整数,然后使用 scanf() 函数从键盘读取输入的整数。
  2. 接着判断输入的整数是否小于等于1,小于等于1的数不是素数,因为素数定义为大于1的自然数,只有1和本身两个因数的数。
  3. 如果输入的整数大于1,则使用一个整型变量 is_prime 来记录这个数是否是素数,初始值为 1。然后使用一个循环从 2 到 sqrt(num) 的范围内遍历每一个数,看是否能整除输入的整数。如果能整除,则说明输入的整数不是素数,将 is_prime 设置为 0 并跳出循环。
  4. 最后根据 is_prime 的值输出结果,如果为 1,则说明输入的整数是素数,否则不是素数。

  • Tips:为什么循环从2 到 sqrt(num) 的范围?
    • 循环从 2 到 sqrt(num) 的范围是因为,如果一个数 num 不是素数,那么 num 必定存在两个因数 a 和 b,其中 a 和 b 中至少有一个小于或等于 sqrt(num)。
    • 假设 a 和 b 都大于 sqrt(num),那么它们的乘积 ab 就大于 num,与 num 作为 a 和 b 的乘积矛盾。因此,必定存在一个因数小于或等于 sqrt(num)。
    • 举个例子,如果要判断 29 是否是素数,那么只需要从 2 到 sqrt(29) = 5.385 这个整数范围内进行遍历,因为如果存在一个因数大于 5.385,那么它的另一个因数必须小于 5.385,而如果这个因数小于 5.385,那么它的另一个因数必须大于 5.385,这与 29 作为两个因数的乘积矛盾。
    • 因此,将循环的上限设置为 sqrt(num) 是为了减少不必要的遍历次数,从而提高代码效率。

2、 求解2到20000的所有完数,所有的真因数和等于本身的数字成为完数。

tips:在数学中,一个数的因数是能够整除这个数的所有正整数。例如,6的因数包括1、2、3和6本身,因为这些数都可以整除6。因为因数是一组数的集合,所以它们通常是按升序排列的。

一个数的因数可以分为两类:真因数和假因数。一个数的真因数是除了该数本身以外的所有因数。例如,6的真因数是1、2和3。相反,假因数包括该数本身在内的所有因数。因此,6的假因数是1、2、3和6本身。

#include <stdio.h>

int main() {
    int i, j, sum;
    
    // 从2开始查找完数
    for (i = 2; i <= 20000; i++) {
        sum = 1;
        
        // 查找i的因数
        for (j = 2; j <= i/2; j++) {
            if (i % j == 0) {
                sum += j;
            }
        }
        
        // 如果i是完数,打印出来
        if (sum == i) {
            printf("%d\n", i);
        }
    }
    
    return 0;
}


该程序使用两个循环,外部循环从2到20000循环,内部循环查找当前数字的因数,并计算它们的和。如果和等于当前数字本身,则该数字是一个完数,并通过printf函数打印出来。