> 文章列表 > C语言实例:判断素数, 判断Armstrong数(阿姆斯壮数),(多种代码,详细思路)

C语言实例:判断素数, 判断Armstrong数(阿姆斯壮数),(多种代码,详细思路)

C语言实例:判断素数, 判断Armstrong数(阿姆斯壮数),(多种代码,详细思路)

本文将介绍 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;
}

方法三:埃氏筛法

埃氏筛法是一种比较高效的筛法,可以用来求出一定范围内的所有素数。具体思路是:

  1. 先将 2 到 n 的所有整数都标记为素数;
  2. 从 2 开始,将每个素数的倍数都标记为合数;
  3. 一直重复上述步骤,直到所有的数均被标记。

以下是埃氏筛法的 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数的几种常见方法和详细代码思路的介绍,希望能对大家有所帮助。