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

Bląd w programie znajdujący parę liczb spęłniających hipotezę Goldbacha.

Object Storage Arubacloud
+1 głos
661 wizyt
pytanie zadane 15 sierpnia 2020 w C i C++ przez artor Nowicjusz (170 p.)

Witam. Uczę się dopiero programowania i moim zadaniem jest napisanie programu w języku C++, który dla wczytanej liczby parzystej znajdzie przedstawienie tej liczby w postaci sumy dwóch liczb pierwszych (Hipoteza Goldbacha). Wcześniej udało napisać mi się program, który sprawdzał czy liczba jest pierwsza, natomiast gdy próbowałem go zastosować to całość przestała działać. Po wczytaniu liczby program nic nie wypisuje. Dla sprawdzenia dodałem linijkę mająca za zadnie wyświetlac przejścia w pętli i jak się okazało pętla przechodzi tylko raz.

 

using namespace std;
#include <iostream>

int main()
{
    int a,s1=0,s2=0;
    cout<<"Podaj parzysta liczbe naturalna wieksza od dwoch, sprawdzimy czy hipoteza goldbacha jest dla niej prawdziwa."<<endl;
    cin>>a;

    for(int i=0;i<a;i+=1)
    {
        cout<<a-i;
        for(int k=2;k<=i;i+=1)
        {
            if(i%k!=0) s1++;
        }
        for(int t=2;t<=(a-i);i+=1)
        {
            if((a-i)%t!=0) s2++;
        }
        if(s1==i-2 && s2==a-i-2) cout<<a<<"="<<i<<"+"<<a-i<<endl;

    }




    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 15 sierpnia 2020 przez VBService Ekspert (252,660 p.)

Jeżeli wykonujesz increment-ację w pętli for o jeden lepiej jest zapisać ++i (możliwy jest też zapis i++ - pre-increment vs. post-increment).

for(int i=0;i<a;++i) { ...

w linii 13 powinno być:

for(int k=2;k<=i;++k) { ...

w linii 17 powinno być:

for(int t=2;t<=(a-i);++t) { ...
komentarz 15 sierpnia 2020 przez artor Nowicjusz (170 p.)
Niestety nic się nie zmieniło, program nic nie wyswietla
komentarz 15 sierpnia 2020 przez VBService Ekspert (252,660 p.)

Ja tylko pokazałem Tobie, że nie do końca poprawnie miałeś zaimplementowane pętle for, nie znam hipotezy Goldbacha i trudno Mi stwierdzić czy Twój kod (zapis),

...
for(...)
{
   if(i%k!=0) s1++;
}
for(...)
{
   if((a-i)%t!=0) s2++;
}
if(s1==i-2 && s2==a-i-2) cout<<a<<"="<<i<<"+"<<a-i<<endl;

jest prawidłowy i prowadzi do poprawnego rozwiązania problemu. Ja tylko, posługując się analogią szkolną, znalazłem błędy ortograficzne w Twoim wypracowaniu, a czy ono jest na temat ... ? wink

0 głosów
odpowiedź 15 sierpnia 2020 przez Nabuchadonozor Gaduła (3,120 p.)

Nie lepiej zamiast:

using namespace std;

#include <iostream>

zrobić:

#include <iostream>

using namespace std;

? Lepsza estetyka kodu, dzięki czemu również poziom czytelności się podnosi i jest bardziej urokliwie dla oka, ponieważ jako programiści, staramy się używać, że tak to nazwę, podobnego designu kodu. Łatwiej wtedy pomóc osobie, jeśli używa tego samego stylu pisania programu, którego ona sama użytkuje. Wiem, że to detal, ale bardzo ważny, gdy masz zamiar czerpać pomoc z forum. Miłego :)

komentarz 15 sierpnia 2020 przez VBService Ekspert (252,660 p.)

C++/Przestrzenie nazw

Słowem wstępu

Załóżmy, że w grupie znajomych masz dwie osoby o tym samym nazwisku, powiedz „A”. Teraz za każdym razem, gdy wywołasz A, oboje się mylą, jeśli dzwonisz do niego lub do drugiego A. Aby rozwiązać tę anomalię, zacznij używać ich pełnych nazwisk. Przestrzenie nazw w C ++ działają w ten sam sposób. (Źródło - Namespaces)

Jeśli użyjemy dowolnej wyszukiwarki internetowej, to powinniśmy bez problemu znaleźć prosty, szablonowy kod napisany w C++, który wyświetla napis „Hello World!”, w tłumaczeniu na polski „Witaj Świecie!”. Spójrzmy na niego:

 

#include <iostream>
using namespace std;

int main ()
{
   cout << "Hello World!" << endl;
   return 0;
}

 

Crystal ktip.png Zaleca się używanie znaku nowej linii (\n) zamiast manipulatora wyjścia "endl". Chyba że jest to uzasadnione: endl wymusza opróżnienie bufora, ale na przykład przy wielokrotnym zapisie na dysk może to obciążyć jego pracę.

 

komentarz 15 sierpnia 2020 przez Nabuchadonozor Gaduła (3,120 p.)
Dzięki wielkie, siedzę w tym trochę czasu i ani razu nigdzie tego nie usłyszałem. Miłego ;)
komentarz 15 sierpnia 2020 przez Nabuchadonozor Gaduła (3,120 p.)
A jak już wkroczyliśmy w ten temat, co sądzisz o używaniu printf zamiast cout? Które zastosowanie lepsze dla programu?
komentarz 15 sierpnia 2020 przez VBService Ekspert (252,660 p.)
edycja 15 sierpnia 2020 przez VBService

@Nabuchadonozor, przyznam się szczerze, nie zgłębiałem tego tematu, może warto się nad tym "pochylić" wink

ale dam Tobie przykład spróbuj uzyskać taki efekt używając tylko cout wink (zaznaczam, że nie chodzi Mi tu "czy się da, czy nie da się to zrobić", tylko ile kodu trzeba będzie napisać)

Pierwsze moje spostrzeżenie (z doświadczenia z korzystania z cout i printf) używając prostego wyjaśnienia, ten drugi idealnie nadaje się do "efektów specjalnych" na string-ach wink, skracając znacząco kod. Cout podobno jest szybsze no i też jest "podatne" na formatowanie: Obsługa strumienia cout.

P.S. cout czy printf ? [ 1 ] [ 2 ]

P.S. 2 Tak Mi się teraz przypomniało w kwestii string-ów. Taki "suchar", podobno tylko "programiści" widzą tu inny "kontekst". wink

[ Edit ]

Jak widać, cout i printf ... " ... w jednym stali domu ... " wink

#include <iostream>
#include <stdio.h>

using namespace std;

char ANSI_GREEN[10]    = "\u001B[32m";
char ANSI_YELLOW[10]   = "\u001B[33m";
char ANSI_UNDERLINE[7] = "\033[4m";
char ANSI_RESET[9]     = "\u001B[0m";

int main()
{
    int LW = 10;
    int LC = 10;

    printf("\n%sTabliczka mnożenia%s\n", ANSI_UNDERLINE, ANSI_RESET);
    cout << "\n    "; // << ANSI_GREEN;
    for(int i=1; i<=LC; ++i) 
    {
      printf("%s%-3i%s", ANSI_GREEN, i, ANSI_RESET);
    }
    cout << "\n"; // << ANSI_RESET;
    for(int i=1; i<=LW; ++i)
    {
      printf("%s%2i  %s", ANSI_YELLOW, i, ANSI_RESET);
      for(int j=1; j<=LC; ++j)
      {
        printf("%-3i", i*j);
      }
      cout << "\n";
    }
  cout << endl;

  return 0;  
}

 

1
komentarz 15 sierpnia 2020 przez Nabuchadonozor Gaduła (3,120 p.)

Teraz to mnie bardzo zaskoczyłeś, za co Ci dziękuję. Na pewno zagłębię się w ten temat i przerzucę na printf, bo zaczynam pisać pewien program, który krótki nie będzie...

Przeczytam zaraz :)

Otóż to :V

0 głosów
odpowiedź 15 sierpnia 2020 przez artor Nowicjusz (170 p.)

Na początku pierwszej pętli wartości s1 i s2 powinny ustawiać się za każdym razem na zero.


    for(int i=0;i<a;i+=1)
    {
        s1=0;
        s2=0;

 

 

 

Podobne pytania

+1 głos
1 odpowiedź 280 wizyt
+1 głos
1 odpowiedź 151 wizyt
+1 głos
2 odpowiedzi 11,508 wizyt

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 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!

...