Rozkładanie liczby na czynniki pierwsze

0

Zadanie 4
Napisz program który wczyta jedną liczbę, a następnie wyświetli
jej wszystkie czynniki pierwsze. Wczytywana liczba należy do zakresu 2 -10000.

Przykład:
podaj liczbę: 45
dzielniki liczby: 3, 5

Wersja trudniejsza:
Rozłóż wczytaną liczbę na czynniki pierwsze.
Przykład:
podaj liczbe: 45
rozkład na czynniki: 3* 3 *5

Wersja łatwiejsza:

#include <iostream>
#include <math.h>
#include <stdlib.h>
#include<conio.h>

using namespace std;


int TestPierwsza(long long p)
{
	long long r = sqrt(p);
	long long i = 2;

	while (i <= r) if (!(p%i++)) return 0;
	return 1;
}



int main()
{
	int liczba;

	cout << "Podaj liczbe: ";
	cin >> liczba;
	cout << "Dzielniki liczby: ";
	for (int i = 2; i < liczba + 1; i++)
	{
		if (liczba % i == 0 && TestPierwsza(i) == 1)
		{
			cout << i << ", ";
		}
	}
	_getch();
}

I teraz właśnie myślę jak to załatwić, chyba powinienem zamiast wyświetlać ten czynnik dzielić liczbę przez ten czynnik i tak dalej, aż wyjdzie liczba == 1, więc przyda mi się jeszcze jedna pętla - dobrze myślę?

@Edit

Jeszcze przetestuję czy działa, ale załatwiłem to funkcją while( liczba !=1), teraz jeszcze moglibyście mi pomóc w tym, żeby te liczby były posegregowane od największej do najmniejszej i sprawdzić czy kod prawidłowy.

#include <iostream>
#include <math.h>
#include <stdlib.h>
#include<conio.h>

using namespace std;


int TestPierwsza(long long p)
{
	long long r = sqrt(p);
	long long i = 2;

	while (i <= r) if (!(p%i++)) return 0;
	return 1;
}



int main()
{
	int liczba;

	cout << "Podaj liczbe: ";
	cin >> liczba;
	cout << "Rozkład na czynniki pierwsze ";
	
	
	while(liczba != 1){
		
		
		for (int i = 2; i < liczba + 1; i++)
		{
			if (liczba % i == 0 && TestPierwsza(i) == 1)
			{
				liczba = liczba/i;
				cout << i<<"*";
			}
		
		}
	}
	_getch();
}
0

Nie, jedynie trzeba ta pętle przenieść:

    for(int i=2;i*i<liczba;++i)
    {
        while(!(liczba%i))
        {
            liczba/=i;
            cout<<i<<", ";
        }
    }
    if(liczba>1) cout<<liczba;
0
#include <iostream>
#include <string>

int main()
{
	std::string result = "";
	int num = 8192;
	int max = num / 2;
	for(auto i = 2 ; i < max ;) {
		if(num % i == 0) {
			num /= i;
			result += std::to_string(i) + "*";
		} else {
			++i;
		}
	}
	if(result.size()) {
		result.pop_back();
	}
	std::cout << result;

	return 0;
}

http://ideone.com/hkf93B

0
#include <cstdio>

#define MAX_VALUE 10000
bool isPrime[MAX_VALUE+1];
int  primes[MAX_VALUE]; // MAX_VALUE dla wygody
int  primeCount;

void sito()
{
    for (int i = 2; i <= MAX_VALUE; i++) isPrime[i] = true;
    isPrime[0] = isPrime[1] = false;

    for (int i = 2; i*i <= MAX_VALUE; i++)
        if (isPrime[i])
            for (int j = 2*i; j <= MAX_VALUE; j += i) isPrime[j] = false;

    for (int i = 2; i <= MAX_VALUE; i++) if(isPrime[i]) primes[primeCount++] = i;
}

int main()
{
    sito();
    int n;
    scanf("%d", &n);
    if (isPrime[n] || n < 2) printf("%d\n", n);
    else
    {
        for (int i = 0; i < primeCount; i++)
        {
            while (n % primes[i] == 0)
            {
                printf("%d ", primes[i]);
                n /= primes[i];
            }
            if (isPrime[n])
            {
                printf("%d ", n);
                break;
            }
            if (n == 1) break;
        }
    }
}

Jako że miałem to akurat pod ręką...

1 użytkowników online, w tym zalogowanych: 0, gości: 1