WedX - журнал о программировании и компьютерных науках

что я делаю неправильно в этом алгоритме?

Я застрял на этом коде на пару часов. Сумма равна S = 1-x + x^2 - x^3 + x^4.
Мы запрашиваем X и N с начальным значением i = 0. Всякий раз, когда предыдущий показатель степени (i) нечетный, мы прибавляем x^i, а если предыдущий показатель четный, мы вычитаем x^i.
Я поместил их в цикл, но не могу правильно вычислить сумму. Может ли кто-нибудь сказать мне, что я делаю неправильно? Благодарю вас!

import java.util.Scanner;

public class hw1 {
    public static void main(String[] args) {
        try (Scanner scan = new Scanner(System.in)) {
            System.out.println("Sum = 1^0-x^1+x^2-x^3..+x^n");
            System.out.println("Enter number X");
            int X = scan.nextInt();
            System.out.println("Enter number N");
            int N = scan.nextInt();
            int sum = 0;
            for (int i = 0; i <= N; i++) {
                if (i < N) {
                    if (i % 2 != 0)    // if I is even 
                    {
                        sum = sum - (X ^ i);
                    } else    // if I is odd 
                    {
                        sum = sum + (X ^ i);
                    }
                }
            }
            System.out.println("Z is " + sum);
        }
    }
}
05.02.2017

  • Посмотрите, как задать вопрос на странице SO ( stackoverflow.com/help/how-to-ask ). Было бы легче (помочь) ответить, если бы был опубликован полный вопрос. Кроме того, зачем делать цикл for с условием i <= N, но сразу же внутри есть оператор if, противоречащий этому условию (if (i < N)). Кроме того, оператор ^ в java не для экспоненты, это побитовое исключающее ИЛИ (см. docs.oracle.com/javase/tutorial/java/nutsandbolts/ ) - вместо этого попробуйте что-то вроде Math.pow(...) 05.02.2017
  • Большое спасибо, теперь я думаю, что это работает. 05.02.2017

Ответы:


1

Итак, я исправил несколько вещей в вашем коде:

  1. Я переключил оператор ^ (который, как указал @Nick Bell, является побитовым исключающим ИЛИ) для Math.pow.
  2. Я исправил написание ваших переменных x и n. В Java принято давать имена переменных, начинающиеся с нижнего регистра. Верхние регистры (X и N) зарезервированы для констант (поля, отмеченные final) и для классов (в отличие от объектов). Обратите внимание, что это всего лишь соглашение, и код прекрасно работает в обоих случаях. Это просто помогает в чтении кода.
  3. Ваш четный/нечетный чек был перевернут: x % 2 == 0 равно true для четных чисел.
  4. Причина, по которой вы инвертировали свой четный/нечетный чек, вероятно, заключалась в том, что две операции над sum были инвертированы. Сравните с описанием вашей проблемы в первом абзаце вашего вопроса, вы увидите, где вы ошиблись.
  5. Проверка if i < N была излишней. Если вы действительно хотите ограничить вычисления до i < N, вы должны указать это непосредственно в своем первом цикле for.
  6. Я добавил два блока try/catch с бесконечными циклами, которые прерываются при вводе целого числа, потому что ваш предыдущий код вызывал исключение и останавливался, если вы вводили что-то еще, кроме правильно сформированного целого числа (например, буквы или десятичное значение). Вам решать сохранить их или удалить.
  7. Кстати, инициализация x и n значением 0 теперь избыточна, так как ваш код гарантированно сразу присвоит им другое значение.

Это обновленный код.

public static void main(String[] args) {
    try (Scanner scan = new Scanner(System.in)) {
        System.out.println("Sum = 1^0-x^1+x^2-x^3..+x^n");
        System.out.println("Enter number X");
        int x = 0;
        while (true) {
            try {
                x = Integer.parseInt(scan.nextLine());
                break;
            } catch (NumberFormatException e) {
                System.out.println("Enter an integer.");
            }
        }
        System.out.println("Enter number N");
        int n = 0;
        while (true) {
            try {
                n = Integer.parseInt(scan.nextLine());
                break;
            } catch (NumberFormatException e) {
                System.out.println("Enter an integer.");
            }
        }
        double sum = 0;
        for (int i = 0; i <= n; i++) {
            if (i % 2 == 0)    // if I is even
                sum = sum + Math.pow(x, i);
            else    // if I is odd
                sum = sum - Math.pow(x, i);
        }
        System.out.println("Z is " + sum);
    }
}
05.02.2017
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]