Программа на Java для печати рядов экспонент для чисел 3 и 5 и ограничения результата до менее 1000

Я новичок в программировании на Java и попробовал решить несколько задач в Project Euler. Я каким-то образом придумал свою собственную проблему печати последовательности экспонент 3 и 5 и ограничил результат ниже 1000. Я исследовал в течение 3 дней, чтобы найти лучший подход к этой проблеме, но я не мог найти соответствующие статьи. Я встречал алгоритмы экспоненциальных рядов, но сейчас они были слишком продвинутыми для моих возможностей.

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

public class Exponent {        

  public static void main (String[] args) {

    // Declared integers for base and exponent

       int i = 0;  /* for base */      
       int n = 0;  /* for exponent */

       for (n=1; n<5; n++) {

           for (i=1; i<=5; i++) {

               if (i%3 == 0 || i%5 == 0) {

                    System.out.println(Math.pow(i,n));

               }

           }

       }

   } 

}

Этот код выводит следующий результат:

3.0
5.0
9.0
25.0
27.0
125.0
81.0
625.0

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

for (n=1; n<5; n++) //because n<=5 would print result for 5 power 5 which is 3125

Я хотел бы как-то ограничить результат ниже 1000, поэтому не уверен, подходит ли это объявление

int result = 1000; // result variable as 1000

Кроме того, я хочу, чтобы код печатал вывод с чередованием 3 и 5, как показано ниже. Моя программа выводит результат в последовательности 3 и 5 соответственно.

Desired output:

3.0
5.0
9.0
27.0
125.0
81.0
625.0
243.0
729.0

И останавливается на этом, потому что следующее значение превысит 1000.

Я также хотел знать, есть ли какой-либо другой подход вместо использования метода Math.pow (), потому что он возвращает double вместо int. Я хотел бы избежать двойного значения и просто напечатать следующее:

Without double:

3
5
9
27
81
125
243
625
729

person wibwaj    schedule 23.06.2016    source источник
comment
Это выглядит как неправильное решение правильного вопроса ... Если вы хотите получить целое число от двойного, просто проанализируйте его. например int aValue = (int) Math.pow(i,n);. Что касается алгоритма, я не уверен, что вы спросили. Вы хотите, чтобы функция собирала экспоненты до 1000? Если да, добавьте ограничение (например, структуру if)   -  person Bonatti    schedule 23.06.2016


Ответы (5)


Сначала создайте двойник, чтобы сохранить результат:

double result = 0;

Затем создайте бесконечный цикл while, который вычисляет результат с использованием 3 и 5 и прерывается, когда результат превышает 1000.

while(true)
{
    result = Math.pow(3, n);
    if(result > 1000)
    {
        break;
    }
    System.out.println(((int)result));
    result = Math.pow(5, n);
    if(result < 1000)
    {
        System.out.println((int)result);
    }          
    n++;
}

Поскольку показатель степени 3 меньше 5, не прерываются, пока не будет достигнут максимальный показатель степени 3. Поскольку разрыва не происходит, не выводите 5, если оно не является действительным.

Также, чтобы напечатать double как значение int, просто приведите его к int.

РЕДАКТИРОВАТЬ:

Если вы действительно беспокоитесь об эффективности, вот более быстрое решение:

public void calcExponents(int max)
{
    int resultThree = 3;
    int resultFive = 5;

    while(resultThree < max)
    {
        System.out.println(resultThree);
        if(resultFive < max)
        {
            System.out.println(resultFive);
        }

        resultThree *= 3;
        resultFive *= 5;
    }
}

Вы также можете привести аргументы 3 и 5, чтобы сделать еще один шаг вперед.

person duncan    schedule 23.06.2016

Без использования Math.pow () (и печати в другом порядке):

  int[] bases = { 3, 5 };
  long maxval = 1000L;
  for (int base : bases) {
     long value = base;
     do {
        System.out.println( value );
        value *= base;
     } while (value < maxval);
  }
person FredK    schedule 23.06.2016
comment
Классное решение, но разве это не напечатает все 3, за которыми следуют все 5, в отличие от того, как задавался вопрос, который переключался между ними? - person duncan; 23.06.2016
comment
Спасибо за решение, но, как упоминал #duncan, он распечатывает экспоненты 3 первых и 5 следующих. Ищу переключение между 3 и 5 - person wibwaj; 23.06.2016

Почему бы не проверить, больше ли результат 1000, и просто выйти из цикла, если это так?

if(Math.pow(i,n)>=1000)
break;
person master2080    schedule 23.06.2016
comment
Спасибо. Это могло бы решить проблему, но я не думаю, что это эффективно. Нам все равно придется объявить ограничение счетчика в цикле for. Я думаю, что гораздо эффективнее ограничить переменную, чем счетчик. - person wibwaj; 23.06.2016

Намекать:

3.0   = 3^1
5.0   = 5^1
9.0   = 3^2
25.0  = 5^2 // I assume you forgot it
27.0  = 3^3
125.0 = 5^3
81.0  = 3^4
625.0 = 5^4
243.0 = 3^5
729.0 = 3^6

и 3 x всегда меньше 5 x. Таким образом, единственный цикл (для части x) с двумя вычислениями в теле цикла, один для 3 и один для 5, должен выполнить свою работу. Вам просто нужно использовать какое-то условие для части менее 1000, чтобы не печатать 5 5 и 5 6.

person Community    schedule 23.06.2016
comment
В этом-то и дело. Я не хочу использовать условие внутри основного метода. Я надеялся на решение, которое исправит эту проблему в самой локальной переменной. - person wibwaj; 23.06.2016
comment
Я не знаю, каков ваш опыт программирования, но вот совет: не зацикливайтесь на проблемах. Если вы действительно хотите его жестко закодировать, используйте два массива {3,5,3,5,3,5,3,5,3,3} и {1,1,2,2,3,3,4,4,5,6} или серию sysout и готово - person ; 23.06.2016
comment
lol :) Я прохожу проблемы для новичков. Я допускаю что - person wibwaj; 23.06.2016

Вы можете использовать один цикл, проверяя экспоненты для 3 и 5 на каждой итерации и печатая каждый результат, который меньше 1000.

Вы просто хотите убедиться, что вы разорвали цикл, когда ваши 3 превысят 1000.

Чтобы напечатать целочисленные значения, вы можете просто привести результат Math.pow () к типу int.

Есть много разных способов написать такой алгоритм. Вот очень простой (непроверенный) пример:

public class Exponent {        

    public static void main (String[] args) {

        int i = 1; // or start at 0 if you prefer
        // set the max value (could also be parsed from args)
        int maxValue = 1000; 

        // the break condition also increments:
        while (Math.pow(3, i++) < maxValue) { 
            int x3 = (int) Math.pow(3, i);
            int x5 = (int) Math.pow(5, i);

            if (x3 < maxValue) {
                System.out.println(x3);
            } 

            if (x5 < maxValue) {
                System.out.println(x5);
            }
        }
    } 
}
person Greg Zero    schedule 23.06.2016
comment
Идеальный Грег! Большое спасибо. Это работает как шарм! - person wibwaj; 23.06.2016
comment
Грег, скажем, я хочу расширить диапазон с 1000 до 2000 или 3000, это эффективный способ кодирования? У меня сложилось впечатление, что для изменения констант локальная переменная - лучший способ добиться эффективности, но в этом случае мы должны вмешиваться в метод, а не в переменную. пожалуйста, порекомендуйте - person wibwaj; 23.06.2016
comment
Смотрите мою последнюю правку. Вы можете просто объявить переменную сверху, например maxValue. - person Greg Zero; 27.06.2016