Liczby pierwsze – napisanie kodu na podstawie schematu blokowego

2018-11-11 13:49
Bogaty Kot
0

title

Byłby ktoś w stanie napisać mi w C++ analogicznie do tego(żeby wszystko było tak jak wg schematu blokowego dokładnie tak samo) rozwiązanie?
Próbuje sam w C++ ale dawno nic nie robiłem mam taki kod i jest coś źle:


#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for (int i=2;i*i<=n;i=i+1){
    if(i==n)
    cout<<"true";
    else if(n%i==0)
    cout<<"false";
}
return 0;
}
edytowany 1x, ostatnio: furious programming, 2018-11-11 16:14
2018-11-11 14:19
0

Warunek w pętli

 for (int i=2;i*i<=n;i=i+1)

nie pozwala na spełnienie ifa:

if(i==n)

Spróbuj to poprawić i chyba powinno być ok

Pozostało 580 znaków

2018-11-11 14:25
Bogaty Kot
0

A jak powinnien wyglądać warunek żeby było okej bo kminie i nie mogę wymyślć?

Pozostało 580 znaków

2018-11-11 14:28
0

Rozpisz sobie to dla przypadków gdzie n = 7 i n = 19. Powinieneś wykminić kiedy warto przestać iterować i co przebudować w pętli. Dasz sobie radę ;)

edytowany 1x, ostatnio: jpl126, 2018-11-11 14:29

Pozostało 580 znaków

2018-11-11 14:50
Bogaty Kot
0

Nadal nie czaję mógłby ktoś pomóc?

Pozostało 580 znaków

2018-11-13 19:48
0

blad jest w drugiej czesci petli for. Petla ta ma skladnie taką: for(punkt startowy, punkt koncowy, sposob przebiegu) Ostatnia czesc petli to moze byc i=i+1 albo i++ (prawie to samo) i wtedy przechodzimy przez petle w ten sposob: 2,3,4,5,6,... , n (zaleznie czy punkt koncowy jest <n czy =<n). Jesli chcialbys skakac przez potege druga, cos w stylu: 3, 9, 81 (ciagle mowie o i czyli o indeksach) to bys wtedy napisal:
i=i*i
Ale nadal w trzecim punkcie a nie w drugim bo to on sluzy do iteracji, drugi tylko wskazuje warunek konczacy petle

edytowany 2x, ostatnio: lambdadziara, 2018-11-13 19:53

Pozostało 580 znaków

2018-11-13 20:12
0

Twoja pętla jest niepoprawna, gdyż 2 razy sprawdzasz warunek, który tam jest. Jak chcesz się bawić w "dosłowne" tłumaczenie to najlepiej użyć goto (o zgrozo), przykład

#include <stdio.h>
#define loop while (1)

int main() {
  int n, i = 0;
  scanf("%d", &n);

loop:
  if (n == i) goto prime;
  if (n % i == 0) goto not_prime;
  i += 1;
  goto loop;
prime:
  puts("true");
  goto end;
not_prime:
  puts("false");
  goto end;
end:
  return 0;
}

Lub zdecydowanie lepiej dodać sobie takie makro:

#define loop while (1)

Wtedy można zapisać twój przykład tak:

#include <stdio.h>
#define loop while (1)

int main() {
  int n, i = 0;
  scanf("%d", &n);

  loop {
    if (n == i) {
      puts("true");
      return 0;
    }
    if (n % i == 0) {
      puts("false");
      return 0;
    }
    i += 1;
  }
}

Oczywiście tak się w C (i C++) nie pisze, bo to to samo co:

#include <stdio.h>

int main() {
  int n;
  scanf("%d", &n);

  for (int i = 0; i < n; ++i) {
    if (n % i == 0) {
      puts("false");
      return 0;
    }
  }

  puts("true");
  return 0;
}

To by było jeśli chodzi o treść zadania.


Jednak jak sam zauważyłeś nie musimy sprawdzać aż do n a tylko do sqrt(n), co można rozwiązać podobnie do Twojego rozwiązania, ale nie sprawdzając podwójnie warunków:

#include <stdio.h>

int main() {
  int n;
  scanf("%d", &n);

  for (int i = 0; i * i <= n; ++i) {
    if (n % i == 0) {
      puts("false");
      return 0;
    }
  }

  puts("true");
  return 0;
}
edytowany 1x, ostatnio: hauleth, 2018-11-13 20:14

Pozostało 580 znaków

2018-11-13 20:16
kq
0

Twój kod jest bliski temu co masz zaimplementować, wprowadziłeś nawet pewne usprawnienie, bo zauważyłeś, że sprawdzając pierwszość liczby wystarczy sprawdzić dzielniki nie większe niż jej pierwiastek drugiego stopnia.

Niemniej jednak, jeśli chcesz być w pełni zgodny ze schematem, to musisz się tego usprawnienia pozbyć. Ponadto, po wypisaniu true/false musisz przerwać pętlę, za pomocą instrukcji break lub return.


Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0