Кто-нибудь знает, как я могу вернуть простые числа в матрице? - PullRequest
0 голосов
/ 08 мая 2020

Я хочу создать функцию, чтобы узнать, сколько простых чисел в моей матрице (5), и я хочу вернуть количество - 5

Кто-нибудь может понять, где мои ошибки являются? В конце точно есть ошибка, потому что мне не удалось вернуть количество

let matrix = [ [50,17], [19,20,6,40,14], [97] ,[31,9,5] ]; 

let counter = 0

for(let row = 0 ; row < matrix.length ; row++){

    for(let col = 0 ; col < matrix[row].length ;col++){

        function matrixPrimeNumbers(num){

            for(let d = 2 ; d<= num -1 ; d++) {

                if(num % d == 0){

                    return false;
                }
                num++;
                return num.charAt();
           }
       }
   }
}

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Есть много проблем:

  • Функция matrixPrimeNumbers никогда не выполняется. В вашем вложенном l oop вы ничего не делаете, а затем определяете одну и ту же функцию снова и снова. Функция никогда не вызывается.

  • Сама функция имеет неисправный l oop: на самой первой итерации этого l oop она завершится с помощью оператора return . Так что на самом деле зацикливания нет.

  • Вызов num.charAt() - это ... странно? charAt - это строковый метод, который возвращает символ. Зачем вам звонить по номеру и какое отношение это имеет к поиску простого числа? В другом месте у вас есть return false, поэтому, по-видимому, вы хотите, чтобы функция возвращала логическое значение. Истинно, когда num простое число, и ложно, когда нет. Поэтому после завершения l oop просто добавьте return true.

  • num++; неверно. Вы хотите определить, является ли num простым числом, поэтому вам не следует изменять его значение в течение l oop. Вероятно, вы намеревались сделать counter++;, но он поставлен не в том месте. Это следует делать только в том случае, если вы уверены, что делитель отсутствует, и поэтому его следует размещать после l oop. Более того, это должно произойти вне функции, после ее вызова.

  • Вы говорите, что хотите «вернуть количество». Но вы никогда не вернете счетчик. Чтобы что-то вернуть, вам нужна функция для этого. Так что оберните большую часть кода в функцию, и пусть она вернет счетчик;

  • Нормально иметь функцию для определения, является ли num простым, но затем назовите ее соответственно вроде isPrime. Используйте имя matrixPrimeNumbers для основной функции, которая будет выполнять вложенный цикл по матрице. Я бы даже сменил имя на что-нибудь более информативное: countMatrixPrimeNumbers.

  • Необязательно для простого обнаружения с l oop на num-1. Вы можете остановиться на квадрате root из num.

  • Целые числа, равные 1 или меньше, не считаются простыми числами, поэтому вам следует разобраться с этим случаем.

Итак, вот исправление:

let matrix = [ [50,17], [19,20,6,40,14], [97] ,[31,9,5] ]; 

// Define functions at the top level, not inside for-loops
function isPrime(num) {
    if (num <= 1) return false;
    let root = Math.sqrt(num);
    for (let d = 2; d <= root; d++) {
        if (num % d == 0) {
            return false;
        }
    }
    return true;
}

function countMatrixPrimeNumbers(matrix) {
    let counter = 0

    for (let row = 0; row < matrix.length; row++) {
        for (let col = 0; col < matrix[row].length; col++) {
            if (isPrime(matrix[row][col])) {
                counter++;
            }
        }
    }
    return counter;
}

// call it:
console.log(countMatrixPrimeNumbers(matrix));
1 голос
/ 08 мая 2020

Прежде всего, вы не должны объявлять функцию в for l oop. Я не думаю, что это вызывает ошибку, но с некоторым текстовым редактором, вероятно, отображается предупреждение.

Вы можете изменить этот метод (в синтаксисе ES6) , чтобы проверить, является ли число простое число и возвращает (0 или 1) вместо (true или false).

// This method returns 1 if the number is a prime number, else return 0 
const isPrime = num => {
    for(let i = 2, s = Math.sqrt(num); i <= s; i++)
        if(num % i === 0) return 0; // Not a prime number, return 0
    return ( (num > 1) ? 1 : 0 ); // Return 1 if num > 1, else return 0
}

Теперь вы можете использовать функцию isPrime в своем коде следующим образом:

let matrix = [ [50,17], [19,20,6,40,14], [97] ,[31,9,5] ]; 

let counter = 0

for(let row = 0 ; row < matrix.length ; row++){

    // Counter will increase if isPrime returns 1
    for(let col = 0 ; col < matrix[row].length ;col++)
        counter += isPrime(matrix[row][col])

}

console.log(counter); // Should show in console how many prime numbesr you have in the matrix
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...