Вычисление последовательности Хэмминга в C++ (последовательность чисел, которая имеет только 2, 3 и 5 в качестве делителей)
Возможный дубликат:
Генерация последовательности с использованием только простых чисел 2, 3 и 5, а затем отображение n-го члена (C++)
Я всегда думал об этом, и я просто не могу понять это. Мне нужно решить следующую проблему:
Создайте следующую последовательность и отобразите n-й член в последовательности
2,3,4,5,6,8,9,10,12,15 и т. Д...... В последовательности есть только простые числа 2,3,5
Мне нужно использовать базовый C++, такой как while, for, if и т. Д. Ничего особенного. Я не могу использовать массивы просто потому, что я еще мало о них знаю, и я хочу понять код решения.
Я не прошу полного решения, но я прошу руководство, чтобы пройти через это... пожалуйста.
Моя проблема в том, что я не могу понять, как проверить, делится ли число, если число в последовательности делится на любые другие простые числа, кроме 2, 3 и 5.
Также предположим, что я проверяю число следующим образом:
for(int i=2; i<n; i++){
if(i%2==0){
cout<<i<<", ";
}else if(i%3==0){
cout<<i<<", ";
}else if(i%5==0){
cout<<i<<", ";
}
Он не работает просто из-за того, что он будет производить числа, такие как 14, которые могут быть разделены на простое число 7. Поэтому мне нужно выяснить, как обеспечить, чтобы эта последовательность делилась только на 2, 3 и 5..... Я нашел много материалов в Интернете с решениями проблемы, но решения, которые у них есть, слишком развиты, и я не могу их использовать (также большинство из них на других языках... нет C++). Я уверен, что есть более простой способ.
3 ответа
Проблема с вашим кодом заключается в том, что вы просто проверяете один из основных факторов, а не все.
Возьмем для примера 14. Ваш код проверяет, является ли 2,3 или 5 фактором 14, что не совсем то, что вам нужно. Действительно, вы обнаружите, что 2 - это коэффициент 14, но другой фактор, как вы сказали, равен 7. Чего вам не хватает, так это дальнейшей проверки, имеет ли 7 только факторы 2,3 и 5 (что не так). Что вам нужно сделать, это устранить все факторы 2,3 и 5 и посмотреть, что осталось.
Давайте возьмем два примера: 60 и 42
Для 60
Начните с факторов 2
- 60% 2 = 0, так что теперь проверьте 60/2 = 30.
- 30% 2 = 0, так что теперь проверьте 30/2 = 15.
- 15% 2 = 1, так что нет больше факторов 2.
Продолжайте с факторами 3
- 15% 3 = 0, так что теперь проверьте 15/3 = 5.
- 5% 3 = 2, так что больше не будет факторов 3.
Закончите с факторами 5
- 5% 5 = 0, так что теперь проверьте 5/5 = 1
- 1% 5 = 1, так что больше не будет факторов 5.
Мы заканчиваем с 1, так что это число является частью последовательности.
Для 42
Опять начнем с факторов 2
- 42% 2 = 0, так что теперь проверьте 42/2 = 21.
- 21% 2 = 1, так что нет больше факторов 2.
Продолжайте с факторами 3
- 21% 3 = 0, так что теперь проверьте 21/3 = 7.
- 7% 3 = 1, так что нет больше факторов 3.
Закончите с факторами 5
- 7% 5 = 2, так что нет больше факторов 5.
В итоге получается 7 (что-то отличное от 1), поэтому это число НЕ является частью последовательности.
Таким образом, в вашей реализации вы, вероятно, должны использовать 3 цикла while в цикле for, чтобы отразить это.
Сохраните следующее значение i во временной переменной, а затем разделите его на 2 столько, сколько сможете (например, до тех пор, пока i%2 == 0). Затем разделите на 3 как можно дольше. Потом на 5. А потом проверь, что осталось.
Как насчет этого?
bool try_hamming(int n)
{
while(n%2 == 0)
{
n = n/2;
}
while(n%3 == 0)
{
n = n/3;
}
while(n%5 == 0)
{
n = n/5;
}
return n==1;
}
Это должно вернуть true, когда n - число Хэмминга, и false - в противном случае. Так что основная функция может выглядеть примерно так
#include<iostream>
using namespace std;
main()
{
for(int i=2;i<100;++i)
{
if(try_hamming(i) )
cout<< i <<",";
}
cout<<end;
}
это должно распечатать все числа Хемминга меньше 100