Разделите целое число на две (почти) равные части

Мне нужно разделить целое число на два числа. Что-то вроде деления на два, но я хочу получить только целые компоненты, например:

6 = 3 and 3
7 = 4 and 3

Я попробовал следующее, но я не уверен, что это лучшее решение.

var number = 7;
var part1 = 0;
var part2 = 0;

if((number % 2) == 0) {
    part1 = number / 2;
    part2 = number / 2;
}
else {
    part1 = parseInt((number / 2) + 1);
    part2 = parseInt(number / 2);
}

Это делает то, что я хочу, но я не думаю, что этот код чист.

Есть ли лучшие способы сделать это?

Ответ 1

Просто найдите первую часть и вычтите ее из исходного номера.

var x = 7;

var p1 = Math.floor(x / 2);
var p2 = x - p1;

console.log(p1, p2);

Ответ 2

Пусть javascript сделает для вас математику.

var x = 7;
var p1 = Math.ceil(x / 2);
var p2 = Math.floor(x / 2);
console.log(p1, p2);

Ответ 3

Ваш код может быть немного упрощен:

var num = 7;
var p1 = Math.floor(num / 2);
var p2 = p1;

if (num % 2 != 0) {
   p1++;
}
console.log(p1, p2);

Ответ 4

var num = 7;

var part1 = parseInt(num/2);
var part2 = num - part1;

console.log(part1, part2);

Ответ 5

Другой способ сделать это - использовать побитовые операторы. Это не работает для очень больших чисел

function splitter(number){
  part1 = (number>>1) + (number&1);
  part2 = number>>1;
  console.log(number + ":", part1 + "+" + part2);
}

splitter(7);
splitter(6);
splitter(2**30+1); // Breaks for values greater than 2**31
splitter(2**31+1); 

Ответ 6

var x = 11;             
var a = Math.ceil(x/2);   
var b = x-a;             

console.log("x = " + x + " , a = " + a + " , b = " + b);

Ответ 7

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

function printSeparatedInts(num) {
  let smallerNum = Math.floor(Math.random() * Math.floor(num));
  if (num && smallerNum === (num/2)) {    // checking if input != 0 & output is not consecutive
    printSeparatedInts(num)
   } else {
    console.log(smallerNum, (num - smallerNum))
  }
}

printSeparatedInts(22)
printSeparatedInts(22)     // will likely print different output from above
printSeparatedInts(7)

Ответ 8

Чувствуете себя ленивым? Нет проблем !

Я с гордостью представляю вам объект-генератор!

Инициализируйте это и просто используйте это! Это автоматически изменит значение при любом другом использовании, даже в той же строке!

Использование: a = new splitter(n) затем console.log(a+" and "+a)

function splitter(n){
    this.p1 = Math.floor(n/2);
    this.p2 = n-this.p1;
    this.cnt=0;
    this.valueOf= ()=> (++this.cnt%2)? this.p1:this.p2;
    return n;
}

a = new splitter(5);
console.log(a + " and " +a);
console.log(a + " and " +a);
console.log(a + " and " +a);

b = new splitter(11);
console.log(b + " and " +b);

Ответ 9

var number = 7;
var part1 = 0;
var part2 = 0;

if(number == 0) {
    part1 = (part2 = 0);
    console.log(part1, part2);
}
else if(number == 1) {
    part1 = 1;
    part2 = 0;
    console.log(part1, part2);
}
else if((number % 2) == 0) {
    part1 = part2 = number / 2;
    console.log(part1, part2);
}
else {
    part1 = (number + 1) / 2;
    part2 = number - part1;
    console.log(part1, part2);
}

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

Ответ 10

Или так:)

var number = 7;
var part1 = ~~((number / 2) + (number % 2));
var part2 = ~~(number / 2);

console.log(part1, part2);

Ответ 11

var n = 7;
var p1 = (n - (n % 2)) / 2;
var p2 = (n + (n % 2)) / 2;

console.log(p1, p2);