Math expression

Здравейте,

имам нужда от малко помощ с довършването на задачата https://judge.telerikacademy.com/problem/01mathexp.
С този код https://pastebin.com/7zrVLYGv, case 10 и 11 са ми грешни отговори.
Някакви идеи?

Нещо от закръглянето е проблема.
Когато сменя Math.floor(m % 180) на Math.round(m % 180) 10 и 11 минават
Но 8 и 9 гърмят :smiley:
Към обяд ще го погледна и ще ти кажа ако още не си го оправил.

2 Likes

Math.sin(Number(((BigInt(m*1000000)/BigInt(1000000)) % BigInt(180))));
така мина, благодаря за насоката :slight_smile:

2 Likes

Друг начин е да се използва функцията Math.trunc()

Math.sin(Math.trunc(m % 180))

В условието на задачата не е даден пример как трябва да се пресмята функцията M mod 180 при отрицателни стойности на M, откъдето условието може да се интерпретира по различни начини.

Разликата между Math.floor() и Math.trunc() се състои в това, че Math.floor(x) винаги е най-голямото цяло число, което не надвишава x, докато Math.trunc(x) е x с “отрязана” дробна част, т.е. Math.floor(x), ако x >= 0, и Math.ceil(x), ако x < 0. Например:

Math.floor(-3.2) == -4
Math.trunc(-3.2) == -3

Същият ефект има умножението на x с подходящо цяло число q, такова че q * x да бъде също цяло число, последвано от целочислено деление на q, както в решението на Петър.

Number(BigInt(-3.2 * 10) / BigInt(10)) == -3

Насочи ме израза че подадените числа няма да са с повече от 6 знака след десетичната запетая, а това означaваше за мен че BigInt (евентуално?) ще се погрижи за закръглянето.
Чесно казано Math.trunc() ми бе попаднал на скоро в полезрението, но така и не вникнах в дълбочина в смисалът му, за което съм ти мн благодарен за разяснението :slight_smile:

1 Like