web-dev-qa-db-fra.com

Séparez un entier en deux parties (presque) égales

J'ai besoin de séparer un entier en deux nombres. Quelque chose comme diviser par deux, mais je ne souhaite que des composants entiers, tels que:

6 = 3 and 3
7 = 4 and 3

J'ai essayé ce qui suit, mais je ne suis pas sûr que ce soit la meilleure solution.

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);
}

Cela fait ce que je veux, mais je ne pense pas que ce code soit propre.

Y a-t-il de meilleures façons de procéder?

40
Vash

Il suffit de trouver la première partie et de la soustraire du numéro d'origine.

var x = 7;

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

console.log(p1, p2);

Dans le cas où x est impair, p1 recevra le plus petit des deux addends. Vous pouvez changer cela en appelant Math.ceil au lieu.

107
cs95

Laissez javascript faire Math pour vous.

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

Votre code peut être un peu simplifié:

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

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

Une autre façon de procéder consiste à utiliser des opérateurs au niveau du bit. Cela ne fonctionne pas pour les très grands nombres

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); 
4
TheChetan
var num = 7;

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

console.log(part1, part2);
4
rm -rf star
var x = 11;             
var a = Math.ceil(x/2);   
var b = x-a;             

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

Si au cas où vous ne voulez pas que vos sorties soient consécutives ou exactement identiques et que vous vouliez 'séparer un entier en deux nombres' , voici la solution pour vous:

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)
1
BlackBeard
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);
}

Seule autre solution, je pense que les performances sont OK.

0
chaunv

Se sentir paresseux ? Aucun problème !

Je vous présente fièrement un objet générateur!

Initialisez-le et utilisez-le! Il changera automatiquement la valeur à chaque autre utilisation, même sur la même ligne !!

Utilisation: a = new splitter(n) puis 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);
0
Attersson