Как добавить силовую функцию в сигму - PullRequest
0 голосов
/ 15 января 2019

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

Например:

sigma(0,14) = 1^0 + 2^0 + 7^0 + 14^0 = 4;
sigma(2,12) = 1^2 + 2^2 + 3^2 + 4^2 + 6^2 + 12^2 = 210. 
sigma(a, b).

Я пробовал разные версии, но не знаю, как добавить функцию питания.

try {
    int a = Integer.parseInt(input1.getText());
    int b = Integer.parseInt(input2.getText());
        int result1 = 0;
        for (int i = 2; i <= Math.sqrt(b); i++) 
        { 
            if (b % i == 0) 
            {  
               if (i == (b / i)) 
               result1 += i; 
               else
               result1 += (i + b / i); 
               } 
               } 
        result.setText(String.valueOf(result1 + b + 1));       
}
}

Ответы [ 5 ]

0 голосов
/ 15 января 2019

Вот простой код для вас:

public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);

        List<Integer> listOfBs = new ArrayList<>();
        System.out.println("Input your a");
        int a = scanner.nextInt();

        System.out.println("Input your b");
        int b = scanner.nextInt();
        int sqrt = (int) Math.sqrt(b);

        for (int i = 1; i <= sqrt; i++) {
            if (b % i == 0) {
                listOfBs.add(i);
                int d = b / i;
                if (d != i) {
                    listOfBs.add(d);
                }
            }
        }

        int sigma = 0;
        for(int e : listOfBs)
        {
            sigma += Math.pow(e,a);
        }

        System.out.println("Your sigma function is: "+sigma);

    }   
}
0 голосов
/ 15 января 2019

IntStream обеспечивает прекрасный краткий расчет.

static int sigma(int exp, int num) {
    IntStream.rangeClosed(1, num)      // 1, ..., num
        .filter(k -> num % k == 0)     // Only divisors
        .map(k -> pow(k, exp))
        .sum();
}

static int pow(int k, int exp) {
    if (exp == 0) {
        return 1;
    }
    int squareRoot = pow(k, exp/2);
    int n = squareRoot * squareRoot;
    return (exp % 2) == 0 ? n : n*k;
}

Расчет мощности можно оптимизировать, используя не exp # умножения k, а квадратные корни.


Для тех, кто заинтересован в преобразовании программы:

pow(k, exp) нужно полагаться только на exp с рекурсией в exp / 2 (целочисленное деление). Таким образом, вы можете вывернуть код наизнанку, иметь вектор делителей, и оперируем этим.

0 голосов
/ 15 января 2019

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

public static long exp(int a, int b){ //computes a^b
    long result = 1;
    for (int i = 0; i < b; i++) {
        result *= a;
    }
    return result;
}
0 голосов
/ 15 января 2019

Я бы порекомендовал вам использовать лямбды Java для выполнения того, что вы ищете.

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

С каждой лямбдой можно легко поднять каждый вход в силу.

Храните две функции отдельно. Используйте более функциональный подход.

0 голосов
/ 15 января 2019

В Java символ ^ означает XOR.

Функция power предоставляется методом Math.pow().

Поэтому 3^2 будет Math.pow(3, 2).

Если выхотел реализовать это сам для целых чисел, вы могли бы сделать это просто так:

double power(int a, int b) {
  int pow = (b < 0) ? -b : b;

  double result = 1;
  for (int i = 0; i < pow; i++) {
    result *= a;
  }

  return (b < 0) ? 1 / result : result;
}

Но я бы сам этого не сделал.Это становится немного сложнее для чисел с плавающей запятой, а Java имеет собственную базовую реализацию, которая намного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...