• 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.

Object Storage Arubacloud
0 głosów
2,442 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 224 wizyt
0 głosów
3 odpowiedzi 6,178 wizyt
pytanie zadane 29 stycznia 2016 w C i C++ przez Memories Obywatel (1,410 p.)

92,584 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...