Требуется вычислить разложение натурального числа на простые множители - C (СИ)
Формулировка задачи:
Простите,что пишу сюда код на си,просто дождаться ответов в разделе "Си" невозможно:
Ошибка в цикле.В чём ошибка?
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main(int argc, char *argv[])
{
int j,r=1,i=0,ostatok,a=2,n,*d;
setlocale(LC_ALL,"rus");
printf("Ââåäèòå Г*Г*ГІГіГ°Г*ëüГ*îå ÷èñëî: ");
scanf("%d",&n);
d=(int*)malloc(n*sizeof(int));
if (d==NULL)
{
printf("ГЋГёГЁГЎГЄГ*! ÍåäîñòГ*òî÷Г*Г® ГЇГ*ìÿòè äëÿ âûäåëåГ*ГЁГї ГҐВё äëÿ Г¬Г*Г±Г±ГЁГўГ*");
system("PAUSE");
return 1;
}
while (r!=n)
{
if (n%a!=0)
a++;
else { d[i]=a; i++; }
r=1;
for (j=0;j<n;j++)
r=d[j]*r;
}
system("PAUSE");
return 0;
}Решение задачи: «Требуется вычислить разложение натурального числа на простые множители»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int IsSimple(int n)
{
int i;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
int j,r=1,i=0,a=2,n,*d;
printf("Enter number:");
scanf("%d",&n);
d=(int*)malloc(n*sizeof(int));
if (d==NULL)
{
printf("Memory allocation error");
getch();
return 1;
}
r=n;
while (r>1)
{
if( r%a==0 && (IsSimple(a) || r==a) )
{
r/=a;
d[i++]=a;
a=1;
}
a++;
}
for (j=0;j<i;j++)
printf("%d ",d[j]);
puts("");
free(d);
getch();
return 0;
}
Объяснение кода листинга программы
Код предназначается для вычисления разложения натурального числа на простые множители. Он использует функцию IsSimple, которая проверяет, является ли число простым, и основной цикл, который выполняет разложение числа на простые множители.
Вот список действий, которые происходят в коде:
- Ввод числа с клавиатуры.
- Выделение памяти под массив
dс помощьюmalloc. - Проверка успешности выделения памяти. Если память не может быть выделена, выводится сообщение об ошибке и программа завершается.
- Инициализация переменных:
rустанавливается равнымn,iустанавливается равным 0,aустанавливается равным 2. - Цикл
whileначинается, гдеrуменьшается на единицу до тех пор, покаrбольше 1. - Внутри цикла проверяется, делится ли
rнаaбез остатка, и при этомaявляется простым числом или равноr. - Если условие выполняется, то
rделится наa,aустанавливается равным 1,d[i++]присваивается значениеa, иaувеличивается на единицу. - После завершения цикла, происходит вывод простых множителей числа
nв порядке их появления. - Вызов функции
freeдля освобождения памяти, выделенной под массивd. - Программа завершается.