种一棵树最好的时间是十年前,其次是现在
博主今天在复习C语言的时候遇到质因数,发现这个知识点忘记了,故有了此篇
先来复习一下概念吧:
一.素数
给你一个数,判断他是否是素数?
说明:为什么是从<2–根号n>循环遍历?而不是从2到n-1? 解释:如果输入的数有一个因子范围在sqrt(n)–n中,那么必然就有一个因子位于2–根号n范围内,例如16=2*8,如果找到了16能被2整除,就没必要找16能被8整除了; 注意开根号函数sqrt(n)要引用头文件#include<math.h>
使用flag=0标记,如果整除就改变flag=1,如果循环结束后flag仍为0就说明不能被<2–sqrt(n)>整除。
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);
}
}
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;
}
二:合数
关于素数和合数的概念小趣味知识: 1.🚗1既不是素数又不是合数 2.🚗大于2的素数都是奇数,2是唯一是偶数的素数 3.🚗大于1的整数中,不是素数就是合数 3.🚗最小的素数和合数都是偶数
想要了解短处法?速戳分解质因数链接
除到7后2-sqrt(7)内的数都不能再被整除,所以得到了最大质因数
短除法 通过不断的递归调用,判断42是否是质数
注意:本题的600851475143数据范围过大,已超过int的最大范围,应使用long long类型定义变量,才能开辟足够容纳他的空间
long long fun(long long n)
{
if (n == 1)
{
return 1;
}
for (int i = 2; i < sqrt(n); i++)
{
if (n % i == 0)
{
return fun(n/i);
}
}
return n;//7是从这里出来的嘻嘻
int main()
{
long long n;
while (scanf("%lld", &n) != EOF)
{
long long ret = fun(n);
printf("%lld\n", ret);
}
return 0;
}
可以变式: 1.打印100-200内所有的素数(备注:除了2外偶数肯定不是素数){如果从101开始,还可以进一步i+=2优化} 2.计数100-200内素数的个数,count++;