ошибки в тестовом цикле while - PullRequest
0 голосов
/ 20 февраля 2019

Вопрос в соответствии с практическим курсом:

Напишите программу на JavaScript, чтобы найти максимальное целое число n такое, что (1 + 2 + ... + n <= заданное целое число) верно,Например,Если заданное целое число равно 10, значение максимального целого числа n равно 4, так что 1 + 2 + 3 + 4 <= 10 является истинным.Ваш выходной код должен быть в формате console.log («Значение n is», variableName) </p>

Мой код:

var num = prompt("Enter a number");

function test(x) {
  var sum = 1,
    n = 1,
    a = 0;
  while (sum <= x) {
    sum += n;
    n = n + 1;
    a += 1;

  }
  return a;
}
var output = test(num);
console.log("Result is :", output);

Я получаю правильные результаты в соответствии с наборами тестов, которые я ввел (10-4,15-5,16-6,17-6), нона сайте написано, что с программой что-то не так.

Что я делаю не так?

Ответы [ 8 ]

0 голосов
/ 20 февраля 2019

Ниже поможет вам сделать работу.

var num = prompt("Enter a number");

function findMaxNumber(num){
	var sum = 0;
	var counter = 0;
	while(sum < num){
        if(sum + counter > num){
            break; // Exit loop
        }
        sum = sum + counter;
        counter++;
	}
	return --counter; // Loop will cause this to be 1 higher than the max int.
}
console.log('Result is: ' + findMaxNumber(num));
0 голосов
/ 20 февраля 2019

Это сокращенная версия вашего кода, в основном мы увеличиваем сначала добавляемое число (n) на каждой итерации, а затем добавляем его в переменную, содержащую sum.Когда условия цикла оцениваются как false, вам нужно уменьшить его до n, чтобы получить значение:

var num = prompt("Enter a number");

function test(x)
{
    var sum = 0, n = 0;

    while (sum <= x)
    {
        sum += (++n);
    }

    return --n;
}

var output = test(num);
console.log("Result is :", output);
0 голосов
/ 20 февраля 2019

Попробуйте следующую функцию, чтобы найти максимальное число

function maxNumber(a){
 var i=1,sum=0,maxNumber=0;
 while(sum<=a) { 
     sum=sum+i; 
     if(sum<=a) 
      { 
        maxNumber=i;
      }
      i+=1;
   } 
   return maxNumber;
} 

дважды проверенное условие sum<=a, чтобы сохранить предыдущее значение цикла и, если условие не выполняется, это означает, что значение текущего цикла бесполезнопоэтому вернулось сохраненное значение предыдущего цикла

Тестирование на выходе :

enter image description here

0 голосов
/ 20 февраля 2019

Ваш порядок работы немного прикольный;все, что вам нужно сделать, это добавить инкрементор.В случае ложного while сумма будет превышать число только один раз.Поэтому, когда вы вернетесь, уменьшите число на единицу:

var num = prompt("Enter a number");
var output = test(num);
console.log("Result is :", output);


function test(num){
  let sum = 0
  let inc = 0
  while(sum<=num)
    sum+=++inc

  return --inc;
}
0 голосов
/ 20 февраля 2019

Лучший ответ, чем зацикливание: использовать математику.Начиная с Формула треугольного числа :

1 + 2 + ... + n = n * (n + 1) / 2

Таким образом, для ввода x вам нужно найти n такой, что

n * (n + 1) / 2 <= x

Чтобы решить эту проблемунам нужно устранить неравенство, а затем использовать формулу квадратного уравнения :

n^2 + n <= 2x
n^2 + n - 2x <= 0

n <= (-1 + sqrt(1 + 8x)) / 2

в качестве окончательного решения.например, для

x = 10: n <= (-1 + sqrt(81)) / 2; n <= 4
x = 16: n <= (-1 + sqrt(128)) / 2; n <= 5.156854249492381

Округление верхнего предела вниз, и вы получите максимально допустимое целое число.Переведено на JavaScript:

function test(x) {
  return Math.floor((Math.sqrt(8 * x + 1) - 1) / 2);
}

var num = prompt("Enter a number");
console.log("Result is :", test(num));
0 голосов
/ 20 февраля 2019

Код ниже должен работать для вас.По сути, я сделал следующее: если вход равен 10, а ваша сумма равна 9, он все равно будет включен в цикл while.Затем он снова добавит n, и теперь ваш номер больше, чем ваш ввод (который равен 10), но вы все равно его вернете.Здесь я сделал то, что в конце цикла while, если ваша сумма больше, чем вы, вычтите одну из a.Таким образом, он все равно будет выполняться, но это решит проблему.

Также еще одна ошибка, которую я заметил, заключалась в том, что сумма начиналась с 1, а n начиналась с 1. Вы хотели 1 + 2 + 3 + ... +n, однако, используя ваш предыдущий метод, вы получаете 1 + 1 + 2 + 3 + ... + n.

var num = prompt("Enter a number");

function test(x) {
  var sum = 0,
    n = 1,
    tempSum = 1,
    a = 0;
  while (sum <= x) {
    sum += n;
    n++;
    a++;
    if (sum > x) {
      a--;
    }
  }
  return a;
}
var output = test(num);
console.log("Result is :", output);
0 голосов
/ 20 февраля 2019

Я думаю, что это будет работать для вас:

var num = prompt("Enter a number");

function test(x) {
  var sum = 1,
    n = 0;
    
  while ((sum+n) <= x) {
    n = n + 1;
    sum += n;
  }
  return n;
}
var output = test(num);
console.log("Result is :", output);
0 голосов
/ 20 февраля 2019

Рассмотрим, передано ли значение 11. Тогда максимальное целое число n должно быть 4, потому что 1+2+3+4 < 11 - это истина, а 1+2+3+4+5 < 11 - это ложь.Ваш текущий код выводит 5 для ввода 11, что неверно;Ваш цикл while иногда выходит за рамки sum.

Вам также нужно инициализировать sum, чтобы начать с 0, а не с 1.

Вычтите одно из a перед возвратом:

function test(x) {
  var sum = 0,
    n = 1,
    a = 0;
  while (sum <= x) {
    sum += n;
    n = n + 1;
    a += 1;
    console.log(a, sum);
  }
  return a - 1;
}
console.log(test(10));
console.log(test(11));

var num = prompt("Enter a number");
var output = test(num);
console.log("Result is :", output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...