[蓝蓝计算机考研算法训练二期]-day01

293 阅读2分钟
  1. 从键盘输入一个整数,判断是否为素数。

    素数:素数是除了1和其本身不能被其他数整除的数称为素数。

    思路:

  • 暴力方法:从2开始整除直到n-1,判断能否有被整除的数。

  • 稍微简单:如果一个数要进行因式分解,必定最大的因子会小于等于n的开方。所以数目不需要达到n,而是sqrt(n)。

  • 优化一点:任何除了2的偶数都可以被2整除。所以除数从3开始,同时增量为2。

  • 更优一点:大于5的质数都为6x+1或6x-1。因为6x+2,6x+3,6x+4都可以被分解。

    具体实现:

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

bool isPrime(int n)
{
    if(n==1) return false;
    if(n==2) return true;
     int i=2;

    for(i;i<=n-1;i++){
        if(n%i==0)
            return false;
    }
    return true;
}

int main()
{
    int n;
    scanf("%d",&n);

    if(isPrime(n))
        printf("是素数!");
    else
        printf("不是素数!");

    return 0;
}
bool isPrime(int n)
{
    if(n==1) return false;
    if(n==2) return true;
    int i=2;

    for(i;i<=sqrt(n);i++){
        if(n%i==0)
            return false;
    }
    return true;
}

bool isPrime(int n)
{
    if(n==1) return false;
    if(n==2) return true;
    if(n%2==0)
        return false;

    int i=3;

    for(i;i<=sqrt(n);i+=2){
        if(n%i==0)
            return false;
    }
    return true;
}
bool isPrime(int n)
{
    if(n==1) return false;
    if(n==2||n==3) return true;

    if(n%2==0)
        return false;

    if(n%6==5||n%6==1)
        return true;
    else
        return false;
}

注意点:

  • c语言中bool类型头文件是stdbool.h

  • 头文件math.h

  1. 求解2到20000的所有完数。所有真因数的和等于本身的数字称为完数。

    思路:

  • 把所有因数表示出来,并且加起来和本身进行判断就行。

具体实现:

bool isAllNumber(int n)
{
    if(n==1) return false;
    int sum=0;

    for(int i=1;i<n;i++)
    {
        if(n%i==0)
            sum+=i;
    }
    if(sum==n)
        return true;
    return false;
}