М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации

Алиса любит игры с формулами и недавно придумала такую игру: первый игрок загадывает два натуральных числа a и b (натуральные числа — это целые числа, большие нуля), и сообщает второму игроку значения a+b и a⋅b. Задача второго игрока — назвать любые подходящие a и b или сказать, что первый игрок ошибся и такие значения не могли получиться. Сыграйте с Алисой в эту новую игру: по заданным x=a+b и y=a⋅b отгадайте, какие a и b могли быть изначально загаданы. Входные данные В первой строке воода дано число x, равное сумме двух загаданных чисел (2⩽x⩽10^9). Во второй строке задано число y, равное произведению двух загаданных чисел (1⩽y⩽10^17). Выходные данные Выведите через пробел такие натуральные a и b, для которых верно, что x=a+b и y=a⋅b. Если вариантов ответа несколько, выведите любой. Если такие натуральные a и b не существуют, выведите единственное число 0. Можете написать идею алгоритма или код (желательно на плюсах)

👇
Ответ:
ляпрпммм
ляпрпммм
28.09.2022

Вам нужно найти такие a и b, что a + b = x и ab = y. По теореме Виета a и b - корни уравнения t^2-xt+y=0. Находим дискриминант D=x^2-4y, если он отрицательный - у уравнения не то что натуральных, действительных решений нет. Если дискриминант неотрицательный, но не полный квадрат, то натуральных решений тоже нет. Иначе решения уравнения (x\pm\sqrt D)/2, если они натуральные - это и есть ответ.

У меня нет уверенности, что можно посчитать целый корень из большого натурального числа с стандартных функций, так что напишу свою реализацию на основе двоичного поиска.

#include <iostream>

#include <cmath>

long long isqrt(long long number) {

 long long answer = 0, left = 0, right = 1e9;

 while (left <= right) {  

   long long middle = (left + right) / 2;

   long long middle_squared = middle * middle;

   if (middle_squared == number) {

     return middle;

   } else if (middle_squared < number) {

     answer = middle;

     left = middle + 1;

   } else {

     right = middle - 1;

   }

 }

 return answer;

}

int main() {

 long long x, y;

 std::cin >> x >> y;

 auto d = x * x - 4 * y;

 if (d < 0) {

   std::cout << 0;

   return 0;

 }

 auto sqrt_d = isqrt(d);

 if (sqrt_d * sqrt_d != d) {

   std::cout << 0;

   return 0;

 }

 if ((x - sqrt_d) % 2 != 0) {

   std::cout << 0;

   return 0;

 }

 std::cout << (x - sqrt_d) / 2 << " " << (x + sqrt_d) / 2;

}

4,6(96 оценок)
Ответ:
lushnikov2004
lushnikov2004
28.09.2022

[Del me plz]

Подписываюсь под каждым словом объяснения @Nelle987.

Заданные значения x = a+b и y = ab - подходят под описание теоремы Виета. А значит, мы можем свести задачу к поиску корней квадратного уравнения в целых действительных числах.

Хочу дополнить ответ @Nelle987 другой реализацией целочисленного квадратного корня, работающего на этапе компиляции.

Код:

#include <iostream>constexpr long long isqrt (long long value, long long sq = 1ll, long long dlt = 3ll){    return sq <= value ? isqrt(value, sq+dlt, dlt+2ll) : (dlt >> 1) - 1ll;}int main() {    long long x, y;    std::cin >> x >> y;    auto d = x * x - 4 * y;    if (d < 0) {        std::cout << 0;        return 0;    }    auto sqrt_d = isqrt(d);    if (sqrt_d * sqrt_d != d) {        std::cout << 0;        return 0;    }    if ((x - sqrt_d) % 2 != 0) {        std::cout << 0;        return 0;    }    std::cout << (x - sqrt_d) / 2 << " " << (x + sqrt_d) / 2;    return 0;}
Алиса любит игры с формулами и недавно придумала такую игру: первый игрок загадывает два натуральных
Алиса любит игры с формулами и недавно придумала такую игру: первый игрок загадывает два натуральных
Алиса любит игры с формулами и недавно придумала такую игру: первый игрок загадывает два натуральных
4,8(30 оценок)
Открыть все ответы
Ответ:
AsassinGirl
AsassinGirl
28.09.2022

Казахский орнамент это узор, состоящий из ритмически упорядоченных элементов, свойственных казахскому народному искусству.

Сегодня орнаменты встречаются в одежде, используются в оберегах, украшениях, интерьерах и аксессуарах. Во время ритуальных обрядов — свадеб, похорон или этнических праздников — все вокруг украшают орнаментами.

По особенностям ритма, композиции, симметрии различают типы орнамента: зооморфный, геометрический, растительный и космогонический.

Наблюдая за явлениями природы, тотемными животными и звездным небом, казахский народ создал сотни орнаментов.

Они отождествляли неведомые силы, загадочные и повседневные явления.

4,4(93 оценок)
Ответ:
kjhf2225
kjhf2225
28.09.2022
"Типовой школьный" Паскаль:

// PascalABC.Net 3.0, сборка 1064
const
  k = 100;

var
  s, wd: string;
  i, j, m, n, pt, step: integer;
  Words, WordsSort: array[1..k] of string;
  InOrder: boolean;

begin
  Write('Введите строку: '); Readln(s);
  n := Length(s); pt := 1; m := 0;
  repeat
    // Пропускаем все символы до первого непробельного
    while pt <= n do
      if Ord(s[pt]) <= 32 then Inc(pt) else break;
    if pt <= n then begin
      // Выделяем очередное слово
      wd := '';
      while pt <= n do
        if Ord(s[pt]) > 32 then begin wd := wd + s[pt];Inc(pt) end
        else break;
      if wd <> '' then begin Inc(m);Words[m] := wd end
    end
  until pt > n;
  // Теперь Words содержит все m слов.
  // Отсортируем их в массиве WordsSort методом Шелла
  for i := 1 to m do WordsSort[i] := Words[i];
  step := m div 2;
  while step > 0 do begin
    for j := m - step downto 1 do begin
      i := j;
      while i <= m - step do begin
        if WordsSort[i] > WordsSort[i + step] then begin
          wd := WordsSort[i];
          WordsSort[i] := WordsSort[i + 1];
          WordsSort[i + 1] := wd
        end;
        i := i + step
      end
    end;
    step := step div 2
  end;
  // Осталось поэлементно сравнить оба массива
  InOrder := true; i := 1;
  while InOrder and (i <= m) do
  begin InOrder := (Words[i] = WordsSort[i]); Inc(i) end;
  if m = 0 then Writeln('Строка не содержит слов')
  else
    if InOrder then Writeln('Cлова упорядочены')
    else Writeln('Cлова не упорядочены')
end.

Тестовое решение:
Введите строку: слово1    слово2    слово3    слово4 слово5
Cлова упорядочены

Введите строку: слово1    слово2    слово4    слово3 слово5
Cлова не упорядочены

"Современный" вариант решения на Паскале:

// PascalABC.Net 3.0, сборка 1064
var
  s:string;
begin
  Write('Введите строку: '); Readln(s);
  var Delim:=Range(0,32).Select(x->Chr(x)).ToArray;
  var Words:=s.Split(Delim).Where(x->x<>'');
  var WordsSort:=Words.Sorted;
  if Words.SequenceEqual(WordsSort) then Writeln('Cлова упорядочены')
  else Writeln('Cлова не упорядочены')
end.

Тестовое решение совпадает с вышеприведенным.
4,6(59 оценок)
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ