Parzystość liczby

0

Porgram sprawdzające czy liczba jest parzysta lub też nie w java:

public class Prog2 {
	private static boolean prime(int n)
	{
		if(n%2==0)
		{
			return true;
		}
		return false;
	}

	public static void main(String[] args) {
	
		int i=0;
		int k=0;
		
		try {
			for(i=0;i<args.length;i++)
			{
				k=Integer.parseInt(args[i]);
				if(prime(k))
				{
				System.out.println("Liczba : "+k+"- Jest parzysta.");
				}
				else{
				System.out.println("Liczba : "+k+"- Nie Jest parzysta.");
				}
			}
		} 
                catch (NumberFormatException e) {
			System.err.println("Nie jest to liczba!!");
		}


	}

}

Proszę o sprawdzenie czy tak to może wyglądać...

0
public class Prog2
  {
   private static String[] msg={" - Jest parzysta."," - Nie Jest parzysta."};
   public static void main(String[] args)
     {
      for(int i=0;i<args.length;++i)
        {
         try { System.out.println("Liczba : "+args[i]+msg[Integer.parseInt(args[i])&1]); } 
         catch (NumberFormatException e) { System.err.println(args[i]+" - nie jest liczbą typu int !!"); } // EDIT: poprawiono wg uwagi poniżej.
        }
     }
  }
0

@_13th_Dragon, lubisz komunikaty typu 777777777777777777777 nie jest liczbą!!, bo ja nie.

catch (NumberFormatException e) { System.out.println(args[i]+" - nie jest liczbą typu int !!"); }

Zmieniłem też strumień wyjściowy, ten komunikat jest przeznaczony dla każdego użytkownika programu.

0

Można też użyć:

System.out.println("Liczba : " + args[i] + msg[args[i].charAt(args[i].length() - 1) % 2]);

I będzie działało dla dowolnie dużych liczb.

0

To użyjcie BigDecimala ? :p

1

Obawiam się że żaden kod nie jest poprawny, a to dlatego:

msg[Integer.parseInt(args[i])%2]

Bezpośrednią przyczyną jest to:
http://ideone.com/xMd0M1

O co chodzi - operacja a % b może mieć dwie własności

  • albo zwracać najmniejszego pozytywnego reprezentanta klasy kongruencji modulo b (ależ to mądrze brzmi) - takiego zachowania się w tym przypadku prawdopodobnie ludzie oczekują (tzw. modulo)
  • albo spełnia dzielna = wynik * dzielnik + reszta jeśli wynik = dzielna / dzielnik (w arytmetyce całkowitoliczbowej) (tzw. remainder).

W javie wybrano to drugie zachowanie, przez co dla liczb ujemnych, było nie było poprawnych intów, następuje ArrayOutOfBoundsException:
http://ideone.com/6S9isb

To jedna z niewielu sytucaji kiedy operacje bitowe faktycznie się przydają:
http://ideone.com/fykFTd

0

Ujmę to trochę inaczej.
Jeżeli dzielna i dzielnik są dodatnie, to zachodzi związek:
dzielna = dzielnik*iloraz + reszta
Oczekujemy też, że zwiększenie/zmniejszenie dzielnej o dzielnik nie zmieni reszty, a iloraz zwiększy/zmniejszy o 1. Dopóki dzielna pozostaje >=0 to można to uzyskać.
Na starcie, dzielna = 5, dzielnik = 4, => iloraz = 1, reszta = 1, zachodzi równość 5 = 41 + 1.
Zmniejszamy dzielną o 4, dzielna = 1, dzielnik = 4, => iloraz = 0, reszta = 1, zachodzi równość 1 = 4
0 + 1.
Zmniejszamy dzielną o 4, dzielna = -3, dzielnik = 4, jeśli zachowamy reguły, to iloraz = -1, reszta = 1, równość -3 = 4*(-1) + 1 nie zachodzi.
Reguły trzeba złamać, niektóre języki i pakiety matematyczne (np. Java,C++,Scilab) łamią regułę niezmienności reszty, zachowuję regułę zmniejszenia ilorazu o 1. Inne (np. Python,Maxima) zachowują regułę niezmienności reszty, łamią regułę zmniejszenia ilorazu o 1.

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