この記事では、C 言語で素数を判断するための一般的なコードの書き方をいくつか紹介し、コードのアイデアについて詳しく説明します。
方法 1: 暴力的な列挙方法
激しい列挙は、素数を判断する最も直接的な方法です。数 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;
}
方法 2: 列挙方法の最適化
力ずくの列挙法では、n が 2 から n-1 までの任意の数で割り切れる場合、n は素数であってはならないことがわかりました。ただし、n が 2 から sqrt(n) までの任意の数で割り切れる場合、n は素数であってはなりません。n が素数でない場合、2 つの数値の積に分解する必要があります。そのうちの 1 つは sqrt(n) 以下であり、もう 1 つは sqrt(n) 以上です。また、n が 2 から sqrt(n) までの任意の数で割り切れる場合、これら 2 つの数は 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;
}
方法3:エルシーブふるい法
エスペルスキーふるい法は、特定の範囲内のすべての素数を見つけるために使用できる比較的効率的なふるい法です。具体的なアイデアは次のとおりです。
- まず、2 から n までのすべての整数を素数としてマークします。
- 2 から始めて、素数のすべての倍数を合成数としてマークします。
- すべての番号がマークされるまで、上記の手順を繰り返します。
以下は、Essie メソッドの 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言語の例 - アームストロング数の判定 (アームストロング数)
この記事では、C 言語でアームストロング数を判断するための一般的なコードの書き方をいくつか紹介し、コードのアイデアについて詳しく説明します。
方法 1: 暴力的な列挙方法
アームストロング数は n 桁の数 (n≥3) を指し、各桁の数の n 乗の合計はそれ自体に等しくなります。例: 1^3 + 5^3 + 3^3 = 153。
激しい列挙は、アームストロング数を判断する最も直接的な方法です。数値 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;
}
方法 2: 列挙方法の最適化
力ずくの列挙法では、n が 2 から n-1 までの任意の数で割り切れる場合、n は素数であってはならないことがわかりました。ただし、n が 2 から sqrt(n) までの任意の数で割り切れる場合、n は素数であってはなりません。n が素数でない場合、2 つの数値の積に分解する必要があります。そのうちの 1 つは sqrt(n) 以下であり、もう 1 つは sqrt(n) 以上です。また、n が 2 から sqrt(n) までの任意の数で割り切れる場合、これら 2 つの数は 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言語でアームストロング数を判断するためのいくつかの一般的な方法と詳細なコードのアイデアの紹介でした。