种一棵树最好的时间是十年前,其次是现在

文章目录

  • 判断一个数是否是素数
    • 1-1.基本概念:
    • 1-2.题目描述:
    • 1-3.题解思路:
    • 1-4代码实现
      • 1-4-1方法一:直接flag标记法:
      • 1-4-2方法二:函数法:
    • 2-1基本概念
    • 2-2分解质因数和最大质因数
    • 2-3题目描述
    • 2-4解题思路
    • 2-5代码实现
      • 2-5-1方法:函数递归法:

判断一个数是否是素数

博主今天在复习C语言的时候遇到质因数,发现这个知识点忘记了,故有了此篇

先来复习一下概念吧:

一.素数

1-1.基本概念:

  • .质数:质数又叫素数,素数是指在正整数范围内,大于0并且只能被1和自身整除的数
  • 1不是素数 ,最小的素数是2
  • 举20以内的素数为例:2, 3,5 , 7,11, 13, 17, 19

1-2.题目描述:

给你一个数,判断他是否是素数?

1-3.题解思路:

  1. 如果输入的数为1,则直接判断为不是素数
  2. 如果输入的数不为1.则从<2–sqrt(n)>循环遍历,看他能否被整除
  3. 如果有一个被整除就是素数,并break循环(只有有一个能被整除就能判为素数)
  4. 如果循环结束后,仍然不能被整除,就判断为是素数

说明:为什么是从<2–根号n>循环遍历?而不是从2到n-1?
解释:如果输入的数有一个因子范围在sqrt(n)–n中,那么必然就有一个因子位于2–根号n范围内,例如16=2*8,如果找到了16能被2整除,就没必要找16能被8整除了;
注意开根号函数sqrt(n)要引用头文件#include<math.h>

1-4代码实现

使用flag=0标记,如果整除就改变flag=1,如果循环结束后flag仍为0就说明不能被<2–sqrt(n)>整除。

1-4-1方法一:直接flag标记法:
int main()
{int flag = 0;int n = 0;scanf("%d", &n);if (n == 1){printf("%d不是素数\n",n);}for (int i = 2; i < sqrt(n); i++){if (n % i == 0){printf("%d不是素数\n",n);flag = 1;break;}}if (flag == 0){printf("%d是素数\n",n);}}
1-4-2方法二:函数法:
int is_prime(int n)
{if (n == 1)return 0;for (int i = 2; i < sqrt(n); i++){if (n % i == 0){return 0;//一旦被整除,说明n不是素数,不是素数就返回0}}return 1;//是素数就返回1
}int main()
{int n = 0;scanf("%d", &n);int ret = is_prime(n);if (ret == 1){printf("%d是素数\n",n);}else{printf("%d不是素数\n",n);}return 0;
}

二:合数

2-1基本概念