В этой статье будут представлены несколько распространенных методов написания кода для оценки простых чисел на языке 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 не является простым числом, то его нужно разложить на произведение двух чисел, одно из которых меньше или равно 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;
}
Метод 3: Метод сита Elsieve
Метод решета Эсперского — относительно эффективный метод решета, который можно использовать для нахождения всех простых чисел в определенном диапазоне. Конкретная идея такова:
- Сначала пометьте все целые числа от 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 не является простым числом, то его нужно разложить на произведение двух чисел, одно из которых меньше или равно 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. Я надеюсь, что это может быть полезно для всех.