• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ suma czynników, liczby pierwsze.

VPS Starter Arubacloud
0 głosów
2,637 wizyt
pytanie zadane 10 lutego 2016 w C i C++ przez Lukasz95 Bywalec (2,160 p.)

Zaprojektuj program znajdujący wszystkie liczby od 1 do 1000, których czynniki pierwsze
sumują się do liczby pierwszej (na przykład czynnikami pierwszymi liczby 12 są 2, 2 i 3,
sumujące się do 7, która jest liczbą pierwszą).

Wiem, że błąd mam na pewno w warunkach w warunkach w main()... ale nie mam pomysłu za bardzo.

 

​
#include <iostream>
#include <math.h>
using namespace std;
int pierwsza(int a)
{
     for(int i=2;i<=sqrt(a);i++)
    {
        if(a%i==0) return 0;
    }
    return 1;
}
int main()
{
    int suma=0;
    int pomocnicza,j;
    for(j=1;j<=1000;j++)
    {   pomocnicza=j;
    for(int dzielnik=2;dzielnik<j;dzielnik++)
    {
        if(j%dzielnik==0)
        {
           suma+=dzielnik;
           j=j/dzielnik;
        }
    }
    if(pierwsza(suma)==1)
    cout<<endl<<pomocnicza;
    }
    return 0;
}

1 odpowiedź

+1 głos
odpowiedź 10 lutego 2016 przez Porcupine Nałogowiec (31,560 p.)
wybrane 10 lutego 2016 przez Lukasz95
 
Najlepsza
Zmienną suma powinieneś zerować wewnątrz pierwszej pętli for.

Pozdrawiam,
komentarz 10 lutego 2016 przez Lukasz95 Bywalec (2,160 p.)
Wtedy pętla wykonuje nieskończenie wiele razy.

A co sądzisz o warunkach w 17 i 19 linii?
komentarz 10 lutego 2016 przez Porcupine Nałogowiec (31,560 p.)

Wyślę Ci poprawiony kod do analizy... Szczególnie po to żebyś na przyszłość poprawił trochę styl pisania (tabulacje, entery itp.) ogólnie Twój zamysł całego programu był mniej więcej ok... Z tym, że działania wewnątrz pętli powinieneś wykonywać na zmiennej "pomocnicza" zamiast na orginalnym "j" ponieważ w ten sposób powstaje ta nieskończona pętla, o której pisałeś.

 

#include <iostream>
#include <math.h>
using namespace std;

bool pierwsza(int a) {
    
    for(int i = 2; i <= sqrt(a); i++) {

        if(a % i == 0) return false;
    }
    return true;
}

int main() {

    int suma, pomocnicza;

    for (int j = 1; j <= 1000; j++) {   

	    suma = 0;
    	pomocnicza = j;

    	for (int dzielnik = 2; dzielnik <= sqrt(j); dzielnik++) {
      
	        while (pomocnicza % dzielnik == 0) {

	           suma += dzielnik;
	           pomocnicza /= dzielnik;
	        }
  		}
  		if (pomocnicza != 1) suma += pomocnicza;

	    if (pierwsza(suma))	cout << j << endl;
    }

    return 0;
}

 

komentarz 10 lutego 2016 przez Lukasz95 Bywalec (2,160 p.)
Dzięki właśnie sam to teraz zauważyłem analizując kod ,ale wielkie dzięki.
komentarz 10 lutego 2016 przez Lukasz95 Bywalec (2,160 p.)

Zastanawia mnie jedna linika, już na samym końcu:
 

if(pomocnicza!=1) suma+=pomocnicza;

 

mógłbyś mi ją wytłumaczyć? Z góry dzięki.

 

komentarz 6 marca 2016 przez thedzusi Nowicjusz (190 p.)
while (pomocnicza % dzielnik == 0) {
 
               suma += dzielnik;
               pomocnicza /= dzielnik;
            }
        }
        if (pomocnicza != 1) suma += pomocnicza;

Czesc! :) czy ktos doszedl do "sensu" tej linijki?

 

Byłabym bardzo wdzięczna za odpowiedź, głowie sie drugi dzień nad tym fragmentem:

 

komentarz 2 stycznia 2017 przez morele123 Gaduła (4,790 p.)
Masz znaleźć czynniki pierwsze liczby j. Tam masz w kodzie napisane, że pomocnicza to jest te j twoje. Ten while jest w pętli for w której, na pewno są te czynniki, więc aby je wyznaczyć sprawdzasz, która liczba dzielona na tą twoją j, da resztę zero. On w zmiennej suma, przechowuje, sumę, liczb, które są czynnikami tej liczby. Operacja pomocnicza /= dzielnik, sprawia, ze zmienna pomocnicza jest dzielona na obecny czynnik liczby j. Po wyjściu z pętli while do sumy dodaje jeszcze zmienną j, ponieważ w niektórych przypadkach for się nie wykona i musi zostać do sumy dopisana wartość j, po za tym w while jest operacje dzieląca pomocniczą na dzielnik, więc aby uwzglęnić powtórzenia liczb np. 9 to 3x3, a przy 3 już wyjdzie z pętli. Musisz dodać tą wartość.

Podobne pytania

0 głosów
2 odpowiedzi 245 wizyt
0 głosów
3 odpowiedzi 6,512 wizyt
pytanie zadane 29 stycznia 2016 w C i C++ przez Memories Obywatel (1,410 p.)

93,004 zapytań

141,969 odpowiedzi

321,248 komentarzy

62,340 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...