Задать вопрос
  • Как повернуть прямую на систему координат?

    wataru
    @wataru Куратор тега Математика
    Zakhar Guskov, потому что скалярное произведение дает проекцию, помноженную на длину вектора. Делим на длину вектора один раз и получаем длину проекции. Теперь надо единичный вектор домножить на эту длину и отложить от точки A. Поэтому делим (B-A) на длину еще раз и домножаем на это число. Всего пришлось делить на длину 2 раза.
  • Как ускорить перебор элементов списка?

    wataru
    @wataru Куратор тега Алгоритмы
    Кстати, оберните код в тег code, а то вопрос удалят.
  • Как ускорить перебор элементов списка?

    wataru
    @wataru Куратор тега Алгоритмы
    Вопрос в том, что вы дальше с этой матрицей делать будете. Ее построение особо не ускорить. Ну, в несколько раз переписав на c++ и используя векторизацию. Для сотен тысяч строк все равно будет работать минуты.

    А вот дальнейшую обработку может и возможно ускорить на порядки, если выкинуть всю матрицу целиком и использовать какие-то хитрые алгоритмы на строках. Или матрицу можно не считать всю целиком.
  • Как найти участок памяти с динамическим адресом?

    wataru
    @wataru
    Переменная глобальная, локальная или в куче?
  • По какой причине возникает ошибка вывода после конвертации типа?

    wataru
    @wataru Куратор тега C++
    Nightmare1, Работает ли если вместо string() использовать native_file_string() у path?
  • Как найти количество простых чисел в массиве?

    wataru
    @wataru Куратор тега Алгоритмы
    Память, очевидно, кончилась при попытке завести массив длинной 10^12 для решета эратосфена.

    А про вермя - это же ограничение. Надо уложиться в 1 сек при 1000 практически максимальных числах, что вполне реально, если правильный алгоритм использовать.
  • Как правильно посчитать?

    wataru
    @wataru Куратор тега Математика
    JTester, Вы не все поправили, видимо. 27 слотов, начиная с 0 заканчиваются на 26. У вас там есть 27.
  • Как правильно посчитать?

    wataru
    @wataru Куратор тега Математика
    JTester, Вам сложно отредактировать ваш вопрос? Если вы хотите чтобы люди ответили на ваш вопрос, вам стоит приложить все усилия, чтобы вопрос был сразу всем понятен. Большинство людей не будет лезть в коментарии к чужим ответам, чтобы разобраться, что вы там хотели спросить.
  • Как правильно посчитать?

    wataru
    @wataru Куратор тега Математика
    Жесть какая-то в вопросе. Слота 16 нет и счет от 0 до 27. Примеры кривые - x=5, y=2 должно быть в третем ряду ведь первый ряд - 0, второй - 1. Исправьте вопрос.
  • Как повернуть прямую на систему координат?

    wataru
    @wataru Куратор тега Математика
    Zakhar Guskov, Есть решение гораздо проще. Нужно лишь знать что скалярное произведение векторов равно произведению их длин на косинус угла. Что то же самое, что длина одного вектора, умноженная на длину проекции.

    Если у вас есть едеиничный вектор на прямой, взяв его скалярное произведение с вектором на точку вы получите прокцию вектора на прямую. Отложив его от начала вы получите проекцию точки.

    Пусть A,B - 2 точки на прямой, P - проецируемая точка, то проекция будет
    A+(B-A, P-A)/|B-A|^2 * (B-A) (X, Y) - это скалярное произведение двуз веткоров. B-A - вектор от A до B, что есть просто разность координат точек. |X|^2 - длина вектора X в квадрате.

    Можно или раскрыть формулу для каждой координаты или лучше работать с Point как с векторами. Напишите функции Point Subtract(Point, Point), double ScalarMult(Point, Point) и Point Multiply(double, Point). Для подсчета квадрата длины вектора можно просто перемножить его на себя скалярно. Тогда формулу можно прямо так и записать в коде.

    Эту же формулу можно вывести и подругому:, надо ввести параметр t на прямой и минимизировать расстояние от точки A+t(B-A) до P.
  • Как повернуть прямую на систему координат?

    wataru
    @wataru Куратор тега Математика
    Zakhar Guskov, Опишите вашу задачу. Что дано, что вы хотите получить.
  • Как повернуть прямую на систему координат?

    wataru
    @wataru Куратор тега Математика
    Zakhar Guskov, приведите код, введите тест вроде (1,1),(2,2). Выведите угол. Убедитесь, что он pi/4.

    Похоже вы не в ту сторону вращаете - попробуйте поменять знак у угла перед поворотом.

    Ещё проблема - вы вращаете вокруг точки (0,0). Если прямая не проходит через нее, то она станет горизонтальной, но не совпадает с OX. И никаким поворотом этого не добиться - надо смещать систему координат.
  • Как повернуть прямую на систему координат?

    wataru
    @wataru Куратор тега Математика
    И еще добавлю - во многих языках есть варианты atan функции, которые принимают не отношение, а две координаты вектора. Потому что иначе придется разбирать случаи, чтобы отличить, например, поворот на 10 и 190 градусов.
  • Как оптимизировать программу и код в принципе?

    wataru
    @wataru
    Марк, Это потому что я не обратил внимание на вторую ошибку. Зачем у вас там в цикле стоит else break;? Как только вы встретите первое ребро, которое не лучше текущего минимума, вы выходите из цикла.

    Посмотрите на ваш вывод в этом тесте: вы там находите ребро длины 1, потом 2, потом снова 1 - это все-равно неверно. Алгоритм Крускала должен находить ребра в порядке увеличения длины.
  • Где ошибка в решении?

    wataru
    @wataru Куратор тега C++
    til_down, Тут та же проблема. i перебирает только делители до корня. Если есть делитель больше sqrt(number), как 41 > sqrt(246), то вы его никогда не рассмотрите.

    Решение тут - это рассматривать не только i, но и number / i в качестве делителя. Тогда вам надо внутри сделать 2 цикла по j для проверки i и number/i.
  • Где ошибка в решении?

    wataru
    @wataru Куратор тега C++
    til_down,

    Вот этот код выведет все простые делители числа.
    long long i = 2;
    while (i*i <= number) {
      if (number % i == 0) {
        while (number % i == 0) number /= i;
        cout << i;
      }
      ++i;
    }
    if (number > 1) cout << number;


    Идея в сокращении младшего простого делителя целиком. Этот код работает, потому что поддерживается инвариант, что number не делится ни на одно число, меньшее i. Поэтому, когда оно делится на i, то i простое.

    По идее можно было бы гнать цикл пока i <= number, но можно делать i*i
    Не совсем понял, какой метод вы в итоге используете, но возможно проблема с последним простым делителем. Может так получиться, что после какого-то сокращение number останется простым числом, меньшим i*i. Поэтому после цикла надо проверить, вдруг number не 1.
  • Где ошибка в решении?

    wataru
    @wataru Куратор тега C++
    til_down, Конечно, оно не справляется. Один только цикл до 600851475143 будет выполнятся минут 10. А там внутри ведь еще и цикл для проверки. Я думаю, ваше решение будет пару часов работать.

    Однако, если вы будете сокращать number на i (number /= i;), пока оно делится (может, придется кучу раз сокращать), то не надо внутреннего цикла - i всегда будет простым.

    Вторая оптимизация - можно остановиться, когда i*i > number. Тогда оставшееся number, если оно больше 1, будет каким-то простым числом.

    Это все работает, потому что мы поддерживаем инвариант - number не делится ни на одно число, меньшее i (кроме 1, конечно). Поэтому надо циклом while сокращать i пока можно. Поэтому, если number делится на i, то i - простое. Ведь иначе был бы меньший i делитель number. Поэтому при i*i>number, number - простое, ведь иначе у него был бы какой-то делитель, меньший i.

    Это решение будет работать сильно быстрее.
  • Где ошибка в решении?

    wataru
    @wataru Куратор тега C++
    galaxy, Я бы вообще по-другому делал. Я бы сразу сокращал number на i, пока делится. Это самое i в таком подходе всегда будет простым. Даже внутреннего цикла не надо.
  • Нужно понять что значит код и что выведется на экран?

    wataru
    @wataru Куратор тега C++
    Saboteur, Ага, как минимум 2 байта по стандарту. однобайтовый - это char.
  • Нужно понять что значит код и что выведется на экран?

    wataru
    @wataru Куратор тега C++
    Saboteur, Подсказка, какой тип у указателя?