Сформировать массив из всех делителей числа, которые являются простыми числами - C (СИ)
Формулировка задачи:
Помогите, пожалуйста, написать программу на языке С. Буду признателен за помощь.
Вот условие:
С клавиатуры ввести длинное беззнаковое целое число. Сформировать массив со всех делителей этого числа, которые являются простыми числами (1 и само число в массив не вводить). Напечатать сформированный массив или вывести сообщение об отсутствие простых делителей.
Решение задачи: «Сформировать массив из всех делителей числа, которые являются простыми числами»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
void main()
{
unsigned long nk,nkm;
unsigned long npfj;
unsigned long *npf;unsigned int qpf;
unsigned int jt;
int ifi;
printf("Unsigned Number:");
scanf("%ld",&nk);
for(jt=0;jt<2;jt++)
{
if(jt==1)
npf=(unsigned long*)malloc((qpf+1)*sizeof(long));
nkm=nk;
for(qpf=0;nkm>1;)
{
for(npfj=2,ifi=0;npfj<=nk/2;npfj++)
{
if(nkm%npfj==0)
{
ifi=1;
if(jt==1)
npf[qpf]=npfj;
qpf++;
nkm/=npfj;
break;
}
}
if(!ifi)
break;
}
}
if(qpf)
{
printf("Prime Factors:\n");
for(jt=0;jt<qpf;jt++)
printf("%ld\n",npf[jt]);
}
else
printf("No prime factors\n");
free(npf);
}
Объяснение кода листинга программы
В этом коде постановка задачи следующая:
- Ввести целое число от пользователя.
- Создать массив для хранения простых делителей этого числа.
- Перебрать все числа от 2 до половины введенного числа.
- Проверить, делится ли введенное число на каждое из этих чисел без остатка.
- Если делится, то это простой делитель, и его можно добавить в массив.
- После перебора всех чисел, проверить, были ли найдены простые делители.
- Если были, то вывести их на экран.
- Освободить память, выделенную под массив простых делителей. Список действий в коде:
- Ввод числа от пользователя с помощью функции scanf.
- Выделение памяти под массив простых делителей с помощью функции malloc.
- Инициализация переменных: npf - указатель на начало массива простых делителей, qpf - количество простых делителей, nkm - текущее число для проверки на делимость, ifi - флаг, указывающий, был ли найден простой делитель.
- Основной цикл, который выполняется дважды. Второй раз массив простых делителей увеличивается в размере на 1.
- Внутренний цикл для перебора чисел от 2 до половины введенного числа.
- Внутренний цикл для проверки, делится ли текущее число на простое число без остатка.
- Если делится, то добавляем простое число в массив простых делителей и уменьшаем текущее число на это простое число.
- Если после перебора всех чисел не было найдено простых делителей, то выводим сообщение
No prime factors. - Если были найдены простые делители, то выводим их на экран.
- Освобождаем память, выделенную под массив простых делителей.