本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
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;
}
- 首先定义一个整型变量
num用于存储从键盘输入的整数,然后使用scanf()函数从键盘读取输入的整数。 - 接着判断输入的整数是否小于等于1,小于等于1的数不是素数,因为素数定义为大于1的自然数,只有1和本身两个因数的数。
- 如果输入的整数大于1,则使用一个整型变量
is_prime来记录这个数是否是素数,初始值为 1。然后使用一个循环从 2 到 sqrt(num) 的范围内遍历每一个数,看是否能整除输入的整数。如果能整除,则说明输入的整数不是素数,将is_prime设置为 0 并跳出循环。 - 最后根据
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函数打印出来。