[C++] Znajdowanie dzielników pierwszych liczby

raven168in1
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 15 cze 2011, o 10:40
Płeć: Mężczyzna
Lokalizacja: Ostrołęka

[C++] Znajdowanie dzielników pierwszych liczby

Post autor: raven168in1 »

Mam do zrobienia taki program :
Wczytać liczbę naturalną n>=2. Program ma wypisać wszystkie
dzielniki pierwsze liczby n .
Tyle , że nie wiem co dodać żeby były to dzielniki pierwsze , a nie zwykłe dzielniki. Może ktoś coś wie ?

Kod: Zaznacz cały

#include <iostream>
using namespace std;
int main()
{
    int n;
    int i;
    cout<<"jaka liczba ? "<<endl;
    cin>>n;
    if(n<2)
    {
       do
       {
           cout<<"nie wlasciwe dane"<<endl;
           cout<<"podaj liczbe wieksza , rowna 2: "<<endl;
           cin>>n;
       }
    while(n<2);
     }
     cout<<"dzielniki pierwsze to :"<<endl;
     for(i=1;i<n;i++)
     {
         do
         {
                 if (n%i==0) 
                 cout<<i<<endl;
                 i++;
         }   
         while(i<n);
     }
system("pause");
return 0;    
}
Ostatnio zmieniony 10 wrz 2012, o 16:38 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania. Stosuj tagi code.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

c++ , dzielnik pierwszy

Post autor: royas »

Jak znajdziesz dzielnik to sprawdź czy jest liczbą pierwszą i dopiero wtedy go wypisz.
Coś masz dziwnie z tym do-while zagnieżdżonym w for.
Awatar użytkownika
Althorion
Użytkownik
Użytkownik
Posty: 4541
Rejestracja: 5 kwie 2009, o 18:54
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 9 razy
Pomógł: 662 razy

[C++] Znajdowanie dzielników pierwszych liczby

Post autor: Althorion »

Albo rekurencyjnie, na przykład tak:

Kod: Zaznacz cały

void RozkladNaCzynnikiPierwsze (unsigned int u) {
    for (unsigned int i = 2; i <= u; ++i) {
        if (0 == u%i) {
            std::cout << i;
            if (i != u) {
                std::cout << " * ";
                RozkladNaCzynnikiPierwsze(u/i);
                return;
            }
        }
    }
}
Haqu
Użytkownik
Użytkownik
Posty: 20
Rejestracja: 27 mar 2012, o 19:38
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 1 raz
Pomógł: 1 raz

[C++] Znajdowanie dzielników pierwszych liczby

Post autor: Haqu »

Dokładnie tak jak napisał royas, proponuje napisać osobną funcję, przyjmującą jako argument dzielnnik liczby n, do sprawdzania czy dzielnik nie jest liczbą pierwszą i za każdym razem jak znadziemy dziennik liczby n, poddawać go testowi funkcji.

Co do wewnętrzna fora, to wrzucasz drugą pętle(do while) niepotrzebnie zupełnie, działającą tak samo jak pierwsza, co więcej powoduje u Ciebie powtarzanie się operacji które jest zbędne. Wystarczy że w samym forze będziesz sprawdzał czy liczby od 1 do n są dzielnikami liczby n.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Znajdowanie dzielników pierwszych liczby

Post autor: royas »

A jeśli chcesz to zrobić ciekawie i trochę się pobawić to możesz najpierw zrobić sito Eratostenesa, a potem sprawdzać po kolei podzielność przez wyniki z sita.

Możesz też ulepszyć f. rekurencyjną Althoriona, tak żeby kolejne wywołanie nie zaczynało poszukiwania
od 2, bo i tak mniejszego od i nie znajdzie już.

Kod: Zaznacz cały

void Rozklad(int u,int s)
for (i=s; i<=u; ++i)
...
Rozklad(u/i, i)
To z kolei może naprowadzić na w miarę efektywne rozwiązanie iteracyjne.
ODPOWIEDZ