本文将介绍 C 语言中判断素数的几种常见代码写法,并详细阐述代码思路。
方法一:暴力枚举法
暴力枚举法是最直接的判断素数的方法。对于一个数 n,我们从 2 开始枚举到 n-1,如果存在一个数能够整除 n,则 n 不是素数。否则,n 是素数。
以下是该方法的 C 语言代码实现:
#include <stdio.h>
int isPrime(int n) {
if (n <= 1) { // 边界条件
return 0;
}
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (isPrime(n)) {
printf("%d 是素数\\n", n);
} else {
printf("%d 不是素数\\n", n);
}
return 0;
}
方法二:优化枚举法
我们发现,在暴力枚举法中,如果 n 可以被 2 到 n-1 中的任意一个数整除,那么 n 肯定不是素数。但如果 n 能被 2 到 sqrt(n) 中的任意一个数整除,那么 n 也肯定不是素数。因为如果 n 不是素数,那么它一定可以分解成两个数的积,其中一个数小于等于 sqrt(n),另一个数大于等于 sqrt(n)。而如果 n 能被 2 到 sqrt(n) 中的任意一个数整除,那么这两个数必然都在 2 到 sqrt(n) 中,与前面的假设矛盾。
以下是优化枚举法的 C 语言实现:
#include <stdio.h>
#include <math.h>
int isPrime(int n) {
if (n <= 1) { // 边界条件
return 0;
}
int m = sqrt(n);
for (int i = 2; i <= m; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (isPrime(n)) {
printf("%d 是素数\\n", n);
} else {
printf("%d 不是素数\\n", n);
}
return 0;
}
方法三:埃氏筛法
埃氏筛法是一种比较高效的筛法,可以用来求出一定范围内的所有素数。具体思路是:
- 先将 2 到 n 的所有整数都标记为素数;
- 从 2 开始,将每个素数的倍数都标记为合数;
- 一直重复上述步骤,直到所有的数均被标记。
以下是埃氏筛法的 C 语言实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int* sieve(int n) {
int* primes = (int*) malloc(sizeof(int) * (n + 1));
memset(primes, 1, sizeof(int) * (n + 1)); // 先将所有数标记为素数
primes[0] = primes[1] = 0; // 0 和 1 不是素数
int m = sqrt(n);
for (int i = 2; i <= m; i++) {
if (primes[i]) { // i 是素数
for (int j = i * i; j <= n; j += i) {
primes[j] = 0; // i 的倍数都不是素数
}
}
}
return primes;
}
int isPrime(int n) {
if (n <= 1) { // 边界条件
return 0;
}
int m = sqrt(n);
for (int i = 2; i <= m; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (isPrime(n)) {
printf("%d 是素数\\n", n);
} else {
printf("%d 不是素数\\n", n);
}
int* primes = sieve(n);
printf("%d 以内的素数有:", n);
for (int i = 2; i <= n; i++) {
if (primes[i]) {
printf("%d ", i);
}
}
printf("\\n");
free(primes);
return 0;
}
以上就是 C 语言中判断素数的几种常见方法和详细代码思路的介绍,希望能对大家有所帮助。
C 语言实例 - 判断Armstrong数(阿姆斯壮数)
本文将介绍 C 语言中判断Armstrong数的几种常见代码写法,并详细阐述代码思路。
方法一:暴力枚举法
Armstrong数是指一个 n 位数(n≥3),它的每个位上的数字的 n 次幂之和等于它本身。例如:1^3 + 5^3 + 3^3 = 153。
暴力枚举法是最直接的判断Armstrong数的方法。对于一个数 n,我们先求出它的位数,然后依次求出每个位上的数字的 n 次方,最后将它们的和与 n 进行比较即可。
以下是该方法的 C 语言代码实现:
#include <stdio.h>
#include <math.h>
int isArmstrong(int n) {
int m = n;
int sum = 0;
int k = 0;
while (m > 0) {
k++;
m /= 10;
}
m = n;
while (m > 0) {
sum += pow(m % 10, k);
m /= 10;
}
return sum == n;
}
int main() {
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (isArmstrong(n)) {
printf("%d 是Armstrong数\\\\n", n);
} else {
printf("%d 不是Armstrong数\\\\n", n);
}
return 0;
}
方法二:优化枚举法
我们发现,在暴力枚举法中,如果 n 可以被 2 到 n-1 中的任意一个数整除,那么 n 肯定不是素数。但如果 n 能被 2 到 sqrt(n) 中的任意一个数整除,那么 n 也肯定不是素数。因为如果 n 不是素数,那么它一定可以分解成两个数的积,其中一个数小于等于 sqrt(n),另一个数大于等于 sqrt(n)。而如果 n 能被 2 到 sqrt(n) 中的任意一个数整除,那么这两个数必然都在 2 到 sqrt(n) 中,与前面的假设矛盾。
以下是优化枚举法的 C 语言实现:
#include <stdio.h>
#include <math.h>
int isArmstrong(int n) {
int m = n;
int sum = 0;
int k = 0;
while (m > 0) {
k++;
m /= 10;
}
m = n;
while (m > 0) {
sum += pow(m % 10, k);
m /= 10;
}
return sum == n;
}
int main() {
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (isArmstrong(n)) {
printf("%d 是Armstrong数\\\\n", n);
} else {
printf("%d 不是Armstrong数\\\\n", n);
}
return 0;
}
以上就是 C 语言中判断Armstrong数的几种常见方法和详细代码思路的介绍,希望能对大家有所帮助。