Liczby pierwsze – napisanie kodu na podstawie schematu blokowego

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;
}


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

0

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

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ę ;)

0

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

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

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;
}
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.

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