Разложить число на множители

151
23 марта 2019, 04:00

Дано натуральное число n. Получить его каноническое разложение (разложение на простые множители). А вот мой код...

#include <iostream>
#include <cmath>
#include <locale>
using namespace std;

int main()
{
setlocale(0, "rus");
int n;
cin >> n;

int a(0), b(0), c(0), d(0);
if ((n % 2) == 0)
{
    while ((n % 2) == 0)
    {
        n /= 2; ++a;
    }
}
if ((n % 3) == 0)
{
    while ((n % 3) == 0)
    {
        n /= 3; ++b;
    }
}
if ((n % 5) == 0)
{
    while ((n % 5) == 0)
    {
        n /= 5; ++c;
    }
}
if ((n % 7) == 0)
{
    while ((n % 7) == 0)
    {
        n /= 7; ++d;
    }
}
if ((a != 0) || (b != 0) || (c != 0) || (d != 0))
{
    cout << "Число " << n << " раскладывается на " << a << " * " << b << " * "  << c << " * " << d << " * " << endl;
} // не знаю, почему n не выводится полностью
else
{
    cout << n << " не раскладывается ни на 2, ни на 3, ни на 5, ни на 7 " << endl;
}
system("pause");
return 0;
}
Answer 1

Цикл по делителям не нужен, нужно просто последовательно перебирать делители. В программировании одинаковый код - под запретом: нужно делители записывать в массив. И ответ тоже в массив. Самое главное: ошибка разложения на делители. Вы число не делите. Правильно так : n /= 2 ;. Нужно проверять число на равенство единицы или простому делителю и если он равен ему, то добавляется это разложение и обработка заканчивается.

Пример кода :

// g++ -Wall -Wpedantic разлож.cpp
#include <iostream>
#include <cmath>
#include <locale>
using namespace std;
# define  dividersN 4
int main()
{
//setlocale(0, "rus");
int n; 
cin >> n;
if(n<=0)return  1;
int dividers[dividersN]={2,3,5,7};
char const * dividerName[dividersN]={"два","три","пять","семь"};
int degree[dividersN]={0,0,0,0};
for(int dividerI=dividersN;dividerI>0;){
  --  dividerI  ;
TryAgain :  
  if(n<dividers[dividerI])continue;
  if(n==dividers[dividerI]){
    ++ (degree[dividerI]);
    n = 1 ;
    break;}
  if(n==1)break;
  if((n%dividers[dividerI])==0){
    ++ (degree[dividerI]);
    n /=  dividers[dividerI]  ;
    goto TryAgain;}}
cout << "число n раскладывается = " ;
for(int dividerI=dividersN;dividerI>0;){
  --  dividerI  ;
  if(degree[dividerI])
    cout << dividerName[dividerI]<<"^"<<degree[dividerI]<<" * "; }
cout<<n<<"\n";
//system("pause");
return 0;}

; ------------Без указателей----------

...
int a(0), b(0), c(0), d(0);
if(n==0)return 1;
while ((n%2) == 0) { n /= 2; a++; }
while ((n%3) == 0) { n /= 3; b++; }
while ((n%5) == 0) { n /= 5; c++; }
while ((n%7) == 0) { n /= 7; d++; }
cout << "число n раскладывается на" ;
if(a)cout<<" два ^ "<< a << " * ";
if(b)cout<<" три ^ "<< b << " * ";
if(c)cout<<" пять ^ "<< c << " * ";
if(d)cout<<" семь ^ "<< d << " * ";
cout<< n << "\n";
...
READ ALSO
Изменение размеров виджетов

Изменение размеров виджетов

Как изменить размеры виджетов которые находятся в слое(layout), получается изменить размеры кнопок через qss(пока я что попробовал), но размеры...

148
Прекращена работа программы. Как вы ее исправили-бы

Прекращена работа программы. Как вы ее исправили-бы

Всем привет, начал разработку игры, еще мало чего создал, но после добавления отклика на столкновение почти сразу после запуска exe виндовс...

166
C++ FillArray вызвано исключение [закрыт]

C++ FillArray вызвано исключение [закрыт]

я новенький в изучении C++Что в этом коде может быть не так?

149
Как ответить клиенту файлом на Post-запрос. SpringBoot REST API

Как ответить клиенту файлом на Post-запрос. SpringBoot REST API

Есть API сервер со SpringBootКлиент отравляет POST-запрос c Json в теле

132