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 {...}
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");
}
}
}
Moje wskazówki:
- Niepotrzebnie wypisujesz "Podaj liczbę: ". Kod sprawdzany jest automatycznie i musisz dostosować się do
formatu we/wy opisanego w zadaniu, bo inaczej dostaniesz WA. - 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. - 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. - 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:
- 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. - 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. - Java ma bardzo wolne I/O. Są dużo lepsze sposoby organizacji I/O - poszukaj na przyszłość.
- 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
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
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");
}
}
}
popatrz na moją odpowiedź na twoje pytanie w wątku: ETI06F1 - Pole pewnego koła
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";
}
}
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
Dobry wieczór
Nie chcę zaśmiecać i otwierać nowego tematu, więc tutaj zapytam - czy ktoś mógłby wytłumaczyć, czemu sędzia nie zalicza? Program działa, przetestowałem i nie znalazłem dziur, natomiast u sędziego wyskakuje błędna odpowiedź.
#include
#include <math.h>
using namespace std;
int main()
{
int i, dzielnik, liczba,j;
int pierw;
int spr = 1;
cin >> j;
if (j > 100000)
{
return 0;
}
for (int k=0; k < j; k++)
{
cin >> liczba;
if (liczba > 10000 || liczba == 1)
{
return 0;
}
pierw = sqrt(liczba);
for (i = 2; i <= pierw; i++)
{
dzielnik = liczba % i;
spr = spr*dzielnik;
}
if (spr == 0)
{
cout << "NIE";
}
if (spr != 0 || liczba == 2)
{
cout << "TAK";
}
spr = 1;
}
return 0;
}
Spróbuj może test z zadania to wtedy powinieneś zauważyć błędy w linijkach:
Jeśli sprawdzana jest liczba 1 to wychodzisz z programu
Cały ten if jest niepotrzebny bo autor zadania …
oraz
powinien być jeszcze “znak końca …”
Podejrzewam, że ta konstrukcja jest nieprawidłowa, chociaż nie mogę znaleźć konkretnego przypadku dla którego będzie źle. (jakieś dziwne przepełnienie) Trzeba posprawdzać dokładnie dla kilku pierwszych wartości.
Czy nie jest mylące nazwanie zmiennej będącej reszta z dzielenia dzielnik
Z tego co wiem, liczba 1 nie jest ani liczbą pierwszą, ani liczbą złożoną :D. Czyli wychodzenie z programu wydaje mi się zasadne, bo ma badać czy liczba jest pierwsza czy nie i ma się wyświetlać tylko “TAK” lub “NIE”. Co powinno zatem wyświetlić się w przypadku 1?
Tak czy siak, nawet po wyrzuceniu tego ifa i dodaniu “endl” sędzia odrzuca rozwiązanie, a ja nie wiem dlaczego. Jakiś pomysł?