Професионална програма
Loading...
medical_boy_sf avatar medical_boy_sf 10 Точки

Проблем със задача Even Number на PHP

Здравейте. Имам малък проблем със задачата Even Number от лаба "Basic Syntax, Conditional Statements and Loops". Условието е: 

12. Even Number
Take as an input an even number and print its absolute value. If the number is odd, print Please write an even number. and continue reading numbers while you receive even number and stop the program.
Output
If you receive even number print: The number is: {number} and finish the program, otherwise print Please write an even number.

Реших я на C# и Java без никакви проблеми, но на PHP една от проверките (по-точно първата) гърми. Използвал съм абсолютно същия алгоритъм, както при C# и Java. Пробвах парсването да бъде intval, след това floatval, но резултатът е същият. Моля за помощ. Ето го и кода ми:

https://pastebin.com/wpTSXMe2

Ето и задачата в Judge: https://judge.softuni.bg/Contests/Practice/Index/1191#11

Благодаря предварително за отделеното време.

Тагове:
0
PHP Basics 01/01/2019 13:08:51
The_assassin avatar The_assassin 158 Точки

Лека преработка:

<?php

while (TRUE) {
    $a = intval(readline());
    if ($a % 2 == 0) {
        break;
    } else {
    echo "Please write an even number.".PHP_EOL;
    }
}
echo "The number is: " . abs($a);
?>

 

0
medical_boy_sf avatar medical_boy_sf 10 Точки

Благодаря. Твоят код работи и дава 100/100. Но така и не разбирам каква е разликата в имплементацията на моя и твоя код? И защо същият алгоритъм работи на C# да речем, а тук - не. Би трябвало да има, ако не логическа, то поне техническа причина за това. 

0
The_assassin avatar The_assassin 158 Точки

Честно казано, аз за първи път виждам проверка за четно/нечетно число направена по този начин. Кой ти каза да я правиш така!? Обикновено е % 2 == 0. Ако го преправиш на (% 2 != 0), твоят код също ще мине!

0
medical_boy_sf avatar medical_boy_sf 10 Точки

Кодът ми може да не е изряден, но въпросът си остава - защо "докато числото а е нечетно" (while (a % 2 == 1)) и "докато числото а не е четно" (while (a % 2 != 0)) са две различни неща (защото излиза, че отттам идва проблемът)? 

P. S. Сега видях, че в C# съм я решил с a % 2 != 0, явно заради това там имам 100 точки. Там също a % 2 == 1 не работи. Изглежда има граничен случай където (a % 2 != 0) не е еквивалентно на (a % 2 == 1). 

0
RoYaL avatar RoYaL Trainer 6846 Точки

Ако числата са с плаваща запетая, нормално да не дава остатък 1. Например колко е остатъкът от 2.5 като го разделиш на 2? :)

1
medical_boy_sf avatar medical_boy_sf 10 Точки

Разбирам. Не бях обмислил този вариант, понеже по спомен реалните числа не се делят на четни и нечетни и в главата ми беше идеята, че се подават само цели числа. Благодаря за помощта!  

0
The_assassin avatar The_assassin 158 Точки

Кодът ми може да не е изряден...
 

Аз никъде не правя оценка на кода ти. Просто, тъй като ти беше попитал, аз се опитах да обясня защо моят код минава, а твоят не. Съжалявам, ако си ме разбрал погрешно!

..защото излиза, че отттам идва проблемът

Е аз нали точно това имах предвид в предишния ми коментар...

0
medical_boy_sf avatar medical_boy_sf 10 Точки

Всичко е точно, колега. Вторият ми коментар целеше да те попитам откъде идват различията в резултата, не съм влагал нищо повече :). Благодаря отново за помощта. Лека вечер.

0