Проект Эйлера № 5

0

У меня есть вопрос, касающийся задачи Project Euler Task 5, в C++, который: 2520 - это наименьшее число, которое можно разделить на каждое из чисел от 1 до 10 без остатка.

Какое наименьшее положительное число равномерно делится на все числа от 1 до 20?

Я написал код, который, я думаю, должен работать, но это не так... Я честно понятия не имею, почему это не так, поэтому любая помощь была бы действительно оценена:

#include <iostream>

using namespace std;

int main()
{
  int smallestprod = 1;

  for (int ii = 1; ii <= 20; ii++)
    {
      if (smallestprod % ii != 0)
        smallestprod *= ii;
    }

  cout << "The integer you are looking for is: " << smallestprod << "\n";
  system("pause");
}

Я попытался проверить свою работу, поставив цикл:

for (int jj = 1; jj <= 20; jj++)
  {
    cout << smallestprod % jj << "\n";
  }

Я надеюсь, что выход будет равен 0s (для секции jj цикла), из-за логики в моем цикле ii для, но я получаю некоторые ненулевые числа, что приводит к получению неправильного ответа... У меня есть обманывал с этим какое-то время, и на самом деле не вижу, где логика в винтовой петле ii закручивается... помогите пожалуйста?

  • 2
    Когда он достигает 2, smallestprime становится 2. Для 3 он становится 6. Для 4 у вас уже есть один 2, поэтому вам нужен только еще один. Тем не менее, ваш цикл умножается на 4 вместо 2.
  • 1
    Кстати, название проблемы - наименее общее множество . Возможно, вы захотите прочитать эту страницу, чтобы понять, почему ваш алгоритм не работает, и некоторые идеи о том, как найти LCM из двух или более чисел.
Показать ещё 3 комментария
Теги:

4 ответа

2

Я думаю, что вы получаете число, которое будет слишком большим, а также вызывает недоумение вызывать переменную, которая обычно не является простым "наименьшим простым".

Проведите через петлю вручную:

i=1; smallestprime = 1
i=2; smallestprime = 1 * 2
i=3; smallestprime = 2 * 3
i=4; smallestprime = 6 * 4

Но на последнем шаге вам нужно было только умножить на 2, чтобы ваш ответ был делимым на 4. (12 - наименьшее число, делящееся 1, 2, 3, 4, а не 24).

Я думаю, вы попробуете несколько примеров вручную, например, вручную подсчитав номер 2520, станет понятно, что делать. В основном, когда вы перебираете целые числа k, накапливая ответ N, вам нужно умножить на некоторое подмножество простых коэффициентов k - достаточно, чтобы сделать N делимым на k, но не более того.

Вероятно, самый эффективный способ сделать это - использовать связь между LCM и GCD и рассчитать LCM, используя алгоритм Евклида.

0

Я думаю, вы должны попробовать это.
это просто псевдокод

var n=1
while(1){
    if (n%1==0 && n%2==0 && .....n%20==0){
        print n
        break
    }
    n++
}

он даст ваш ответ так быстро, как вы думаете

0

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

int greatestCommonDivisor(int a, int b)
{
}

LCM двух чисел

int greatestCommonDivisor(int a, int b)
{
}

И LCM массива чисел, по-видимому, решается путем вызова метода наибольшего числа (int a, int b) в цикле:

int leastCommonMultiple(int[] nums, int len)
{
    int curr = 1;
    for(int i = len-1; i >= 0; --i) {
        curr = leastCommonMultiple(curr, nums[i]);
    }
    return curr;
}
0

Когда вы умножаете все числа от 1 до 20, вы получите переполнение для стандартного 32-битного int, максимальное значение которого составляет только 2 147 483 647. Таким образом, невозможно сохранить такой результат умножения в переменной int и что причина для "странных" эффектов, которые вы обнаружили в выводе.

Но вам не нужно умножать все числа от 1 до 20, чтобы получить ответ. Выяснить все основные факторы, которые появляются в заданном диапазоне, и их множественность будет достаточно для решения проблемы.

  • 0
    Как примечание, хотя ни одна из ранних проблем проекта Эйлера не потребует алгоритма, который будет переполнять 32-битные целые числа, многие последующие проблемы делают. Настоятельно рекомендуется ознакомиться с библиотекой больших чисел, если используемый вами язык не использует произвольное целое число точности.
  • 0
    Или напишите реализацию для больших чисел, которая определенно может быть полезна :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню