Функция разложения натурального числа А на простые множители - C (СИ)
Формулировка задачи:
Подскажите,пожалуйста, как решается эта задача. Язык Си учу всего 2 недели,поэтому плохо в нем разбираюсь
Описать функцию Factors(A,N,F), находящую разложение натурального числа А на простые множители. Количество множителей возвращается в целой переменной N,а сами множители(в порядке неубывания)-в целочисленном массиве F(F и N-выходные параметры, макс.число массива F=15). С помощью этой процедуры разложить на простые множители 5 данных чисел.
Решение задачи: «Функция разложения натурального числа А на простые множители»
textual
Листинг программы
#include <stdio.h>
#define MAX 15
void Faktors(int A, int *N, int F[]);
int nextPrime(int n);
int main(void) {
const n = 5;
int i[n], j;
for (j = 0; j < n; ++j) {
printf("enter the %d. number: ", j+1);
scanf("%d", &i[j]);
}
for (j = 0; j < n; ++j) {
int N = 0, F[MAX] = {0};
Faktors(i[j], &N, F);
printf("\nnumber: %d\nnumber of multiples: %d\n", i[j], N);
printf("prime numbers: ");
int k;
for(k = 0; F[k]; ++k)
printf("%d ", F[k]);
putchar('\n');
}
return 0;
}
void Faktors(int A, int *N, int F[]) {
int n = 2;
int state; /////
while (*N < MAX && A >= n) {
state = 1; /////
while (A%n == 0) {
if (state) { /////
++*N;
state = 0; /////
} /////
*F = n;
++F;
A /= n;
}
n = nextPrime(n);
}
}
int nextPrime(int n) {
int state = 1;
int i;
while (state) {
++n;
state = 0;
for ( i = 2; i <= n/2; ++i)
if (!(n%i)) {
state = 1;
}
}
return n;
}
Объяснение кода листинга программы
- Программа разбивает введенное натуральное число на простые множители.
- В функции
Faktorsиспользуется циклwhile, который выполняется до тех пор, пока количество множителей не достигнет максимального значенияMAXи числоAбольше текущего простого числаn. - В каждой итерации цикла
whileпроверяется, делится ли числоAна текущее простое число без остатка. - Если делится, то увеличиваем счетчик множителей
*Nи устанавливаем флагstateв 0. - В каждой итерации цикла
whileтакже обновляется значение*Fи увеличивается указательF. - Число
Aделится на текущее простое число. - Если число
Aне делится на текущее простое число, то увеличиваем значениеnи переходим к следующей итерации циклаwhile. - В функции
nextPrimeиспользуется циклwhile, который выполняется до тех пор, пока не будет найдено следующее простое число. - В каждой итерации цикла
whileувеличивается значениеn. - Для каждого числа от 2 до
n/2проверяется, является ли оно простым числом для числаn. - Если число
iявляется простым числом для числаn, то устанавливается флагstateв 1 и выполняется переход к следующей итерации циклаwhile. - Функция
nextPrimeвозвращает следующее простое число. - В функции
mainиспользуется циклforдля считыванияnнатуральных чисел от пользователя. - Для каждого введенного числа вызывается функция
Faktors, которая разбивает число на простые множители и выводит результат на экран. - В каждой итерации цикла
forвыводится число и количество его множителей. - Выводится список простых чисел, которые являются множителями числа.
- Программа завершается успешно, возвращая значение 0.