200 / 277
Apr 2019

Wyrzuciłem boola poza main, do tego poprawiłem pętlę for i błąd, przez który 0 i 1 były uznawane za liczby pierwsze.
Jednak dalej nie przyjmuje, tym razem jest to błędna odpowiedź.

a czy zdarza ci się testować program, choćby czasami ?
bo warto :slight_smile: - choćby dla danych podanych w zadaniu

Tak, zawszę testuję. W visual studio program bez problemu działa i wyświetla poprawnie tak dla liczb pierwszych i nie dla liczb niebędących pierwszymi. Natomiast tutaj za każdym razem występuje problem

nie rozumiesz treści zadania i nie rozumiesz, co piszę
czy naprawdę dla danych testowych z zadania masz taki wynik, jak podano ?
a generalnie, to należy testować w środowisku podobnym do tego, w jakim działa spoj - czyli na ideone.com, a jeżeli już na vs, to z przekierowanym wejściem/wyjściem

@general_iceman przeczytaj jeszcze raz treść zadania:

Input
n - liczba testów n<100000, w kolejnych liniach n liczb z przedziału [1…10000]

Teraz przyjrzyj się przykładowemu wejściu i SPRAWDŹ swoje wyniki

Input:
3
11
1
4
Output:
TAK
NIE
NIE

Poza tym w funkcji Pierwsza(x) powinieneś rozpatrywać przypadek 0 i 1. W funkcji Main będziesz mógłbyś uprościć kod do takiej konstrukcji:

if (Pierwsza(x)) {...}
else {...}

Dziękuję za pomoc, rzeczywiście źle odniosłem się do treści, po poprawieniu zaliczyło. Dodatkowo zrobiłem porządek w kodzie zostawiając w main jedynie pobieranie liczb do sprawdzenia i wyświetlanie, a całość sprawdzania przeniosłem do bool

Witam, jestem nowym użytkownikiem i świeżym “programistą”. Uczę się Javy od kliku dni Mam problem z tym zadaniem. W domu wszystko hula jak należy, ale na serwerze wyrzuca błąd NZEC. Czy ktoś wie gdzie mam błąd? Mój kod wygląda tak:

import java.util.;
import java.lang.
;

class Main
{
public static void main (String[] args) throws java.lang.Exception
{
Scanner scanner = new Scanner(System.in);

    for(int i = 0; i < 100000; i++){
    System.out.println("Podaj liczbę:");
    int liczba = scanner.nextInt();
    int k = 0;
    
    for(int j = 1; j < liczba; j++)
    if(liczba%j == 0)
    k++;
    
    if(k>1)
    System.out.println("NIE");
    else
    System.out.println("TAK");
    }
}

}

Przeczytaj uważnie treść zadania. JEDYNE co masz wypisywać to: TAK lub NIE. Poza tym…

  1. Nie znam jawy ale nie widzę wczytywanie liczby testów.
  2. Nie ma potrzeby dzielenia modulo aż do liczba-1. W zupełności wystarczy do pierwiastka z liczby

Moje wskazówki:

  1. Niepotrzebnie wypisujesz "Podaj liczbę: ". Kod sprawdzany jest automatycznie i musisz dostosować się do
    formatu we/wy opisanego w zadaniu, bo inaczej dostaniesz WA.
  2. Nie wczytujesz liczby określającej liczbę przypadków testowych - musisz ją wczytać a potem uruchomić pętlę dla
    testów. Ty wykonujesz tę pętlę zawsze 100000 razy.
  3. Wystarczy sprawdzać dzielniki od 2 do pierwiastka z n. (int j = 2; j*j <= n; j++). Gdy tylko znajdziesz dzielnik możesz
    opuścić tę pętlę, bo liczba będzie złożona.
  4. Musisz rozważyć sytuację gdy liczba to 0 lub 1 - bo to nie są liczby pierwsze.

Powyższe wskazówki pozwolą Ci na uzyskanie AC. A oto bardziej ogólne porady:

  1. Najoptymalniejszym sposobem na to zadanie jest sito Erastotenesa - jak już pouczysz się trochę to proponuję
    powrócić do tego zadania i zaliczyć je tym algorytmem.
  2. Swój kod przekazuj w formie linku do ideone.com1. Możesz tam wklejać input i testować swój kod.
    Staraj się też poprawić czytelność kodu.
  3. Java ma bardzo wolne I/O. Są dużo lepsze sposoby organizacji I/O - poszukaj na przyszłość.
  4. To zadanie wcale nie jest najłatwiejsze z kategorii łatwych. Poniżej masz linki do kilku bardzo prostych, żebyś mógł
    się oswoić:
    https://pl.spoj.com/problems/PTEST/6
    https://pl.spoj.com/problems/POTSAM/4
    https://pl.spoj.com/problems/MWPZ06X/3
    https://pl.spoj.com/problems/VSR/4

Hmm… Zadanie ze średnią jest bardzo proste z punktu widzenia napisanego kodu, ale jeśli dla kogoś kto ma problemy z fizyką (a takich jest wielu) to zadanie nie musi być bardzo łatwe :slight_smile:

Ale sprawdziłem że kolega blackfoo ma jako instytucje wpisany Uniwersytet Warszawski, więc zakładam, że powinien
sobie poradzić

Dzięki wielkie za odpowiedzi i cenne rady :slight_smile: Faktycznie, muszę zwrócić większa uwagę na treść zadania. Kiedyś liznąłem 1 semestr C++, ale było to dawno i wszystko zapomniałem. Teraz studiuje na Wojskowej Akademii Technicznej (ang. Warsaw Univeristy of Technology), tylko ucięło końcówkę.

9 days later

Witam Czy jest jakaś dobra dusza która programuje w Jave i wyjaśni mi co w moim kodzie nie działa ? Programuje od kilku dni i brakuje mi doświadczenia dlatego zgłaszam się do mądrzejszych :smiley:

import java.util.Scanner;

public class LIczbyPierwsze {

public static void main(String[] args) {


    int b = 1;
    int c = 0;

    Scanner lPierwsza = new Scanner(System.in) ;
    int a = lPierwsza.nextInt();

    int g = a+1;
    for ( int i =1;i<g;i++)
    {
        if (a%i==0){
          c = b++ ;
        }
    }

    if (c==2){
        System.out.println("TAK");
    }else{
        System.out.println("NIE");
    }


}

}

13 days later

RESULT: “Błędna odpowiedź”. Proszę o pomoc z jakiego powodu dostaję błąd. Kod sprawdza liczby pierwsze prawidłowo.


#include
#include <math.h>

using namespace std;

int t, i;
int a, m, w;
string odp;

int main()
{
cin>>t;
while((t<=0) || (t>100000))
{
cin>>t;
}

for(i=0; i<t; i++)
{
    cin>>a;

    while((a<=0) || (a>=10000))
    {
        cin>>a;
    }

    odp="TAK";

    for(m=2; m<=sqrt(a); m++)
    {
        w=a%m;
        if(w==0) odp="NIE";
    }

    if(a==1) odp="NIE";

    cout<<odp<<endl;

}
cout<<endl;

return 0;

}

Pomyliłeś się w sprawdzeniu, które nie było wcale potrzebne:

while((a<=0) || (a>10000))

Poza tym tam można by użyć pętli do … while żeby uniknąć redundancji kodu.

Mam kilka uwag. Sprawdzanie czy liczba jest pierwsza możesz wydzielić do osobnej funkcji. Nie używaj zmiennych globalnych. Używanie jednoliterowych nazw jest złym pomysłem - utrudnia czytanie i korzystanie z kodu. Zamiast <math.h> dołączaj < cmath > (raczej nie używamy zdeprecjonowanych/przestarzałych nagłówków z C). Poczytaj o typie bool.

Przykład:

#include <iostream>
#include <cmath> 

bool is_prime(int number)
{
	if (number < 2) {
		return false;
	}
	// ...
}

int main()
{
	int tests;
	std::cin >> tests;
	for (int i = 0; i < tests; i++)
	{
		int number;
		std::cin >> number;
		std::cout << (is_prime(number) ? "TAK" : "NIE") << "\n";
	}
}

Dziękuję za odpowiedź i cenne uwagi. Postaram się przerobić kod i ponownie sprawdzić czy zostanie zaakceptowany.

Witam! Czy jest ktoś kto umiałby mi wytłumaczyć dlaczego sędzia tego nie zalicza chociaż w kompilatorze wynik jest poprawny. Z góry dziękuje za odpowiedź.
#include
#include

using namespace std;
int liczba, dzielniki;
int main()
{
cin>>liczba;
if(liczba>=2)
{
for(int i=1;i<=liczba;i++)
if((liczba%i)==0)
{
dzielniki++;
}
}
else
cout<<“NIE”;
if(dzielniki>2)
{
cout<<“NIE”;
}
else cout<<“TAK”;
return 0;
}

sędzia zadania nie zalicza, ponieważ wyniki twojego programu są inne, niż oczekuje (czy inaczej mówiąc: złe)

wskazane jest przekazywanie kodu poprzez ideone.com2 - nie ginie wtedy formatowanie kodu ani jego fragmenty
na ideone.com2 należy też testować program, co najmniej dla danych przykładowych podanych w zadania - zobaczyłbyś wtedy, że wyniki z twojego programu są niewłaściwe

6 months later

chyba zapomniałaś o ; przy tak i nie oraz osobiście usunełabym te < i else przeniosła na nowa linie