правильного квадрата, а потом в случае прохождения проверки найти собственно корень? то есть чтоб не нужны были две функции в связке вида:
if (issquare(num)) a = intsqrt(num);
а
pair_t pair = findsqrt(num);
if (pair.issquare) int a = pair.value;
сами две функции изначально следующие: i64 introot(i64 x) { if (x == 0LL || x == 1LL) return x; i64 left = 1LL, right = x/2LL, ans; while (left <= right) { i64 mid = (left + right)/2LL; i64 sqr = mid*mid; if (sqr == x) { return mid; } if (sqr <= x) { left = mid + 1LL; ans = mid; } else { right = mid - 1LL; } } return ans; } bool issquare(i64 n) { i64 left = 1LL, right = n; while (left <= right) { i64 mid = (left + right)/2LL; if (mid * mid == n) { return true; } if (mid*mid < n) { left = mid + 1LL; } else { right = mid - 1LL; } } return false; }
Например, написать функцию, которая вернет или целочисленный корень, или невалидное значение.
Выкладывай на pastebin или подобное. Слишком большая простыня.
Запаковав результат в структуру, разумеется
ну вот с вышеприведёнными реализациями двух функций мне пришла мысль что может не обязательно оба цикла выполнять, сначала для проверки, а потом для вычисления
ну вот опять же вопрос в реализации
Например, подсчитайте introot и если он в квадрате дает исходное число, то верните some(корень), иначе none
а some и none это что
Обсуждают сегодня