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

VPS Starter Arubacloud
+1 głos
649 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 (251,210 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 (251,210 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 (251,210 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 (251,210 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ź 274 wizyt
+1 głos
1 odpowiedź 151 wizyt
+1 głos
2 odpowiedzi 11,471 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...