【问题标题】:Separate an integer into two (nearly) equal parts将一个整数分成两个(几乎)相等的部分
【发布时间】:2017-07-18 10:49:33
【问题描述】:

我需要将一个整数分成两个数字。类似于除以二的结果,但我只想要整数分量,例如:

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

这是我想要的,但我认为这段代码并不干净。

有更好的方法吗?

【问题讨论】:

  • 另见 Eric Lippert 的guide to doing an integer division problem。这是一个不同的问题,但您可能应该采用类似的方法来定义您的需求,然后才能以明显正确的方式编写代码。
  • 当你真正的意思是Math.floor时,永远不要使用parseInt
  • @Mehrdad 这是一些因素的混合:纯粹的javascript 标签问题变得非常简单(OP 进行零研究)或无聊,发布问题的时间,心情当时的人......当我在这里left a comment 时,它只有 6 个赞成票,但在很短的时间内。然后,该问题被列在“网络热点问题”中。从那时起,这就是滚雪球效应(如果你愿意,也可以是积极的反馈)。
  • 为什么不能是 5,1 和 6,1 ?

标签: javascript math


【解决方案1】:

只需找到第一部分并从原始数字中减去它。

var x = 7;

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

console.log(p1, p2);

如果x 是奇数,p1 将收到两个加数中较小的一个。你可以通过调用 Math.ceil 来切换它。

【讨论】:

  • 我想你想明确地使用Math.floorMath.ceil 当希望第一个是更小/更大的。 round 使它模棱两可。
  • @cᴏʟᴅsᴘᴇᴇᴅ 然后使用 Math.ceil - 你甚至不必考虑知道它会四舍五入,即使例如除数发生变化。
  • 而且 Math.ceil 更短,因此如果这在代码高尔夫上结束,则可以计算更多积分。 :)
  • @georg 绝对值得作为答案,但如果 OP 想要处理浮点数,7 将变为 3.5 3.5,而不是 4 3。我的意思是这超出了问题的范围,我不确定实际回答这个问题并使现有解决方案复杂化比提出一个新问题会有多大好处。
  • @georg 为什么你坚持要改变 OP 的期望?有问题的代码也不适用于浮点数,但 OP 没问题(“这就是我想要的”)
【解决方案2】:

让javascript为你做Math

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

【讨论】:

  • 只是想知道:由于Javascript只有浮点数而不是整数,即使x 是偶数,这种方法是否会导致p1p2 的值不同?
  • @EricDuminil /2 在 IEEE 浮点中不会导致任何可以表示为 /2 之前的浮点的整数的精度损失或舍入。它只是简单地从指数部分减去 1。
  • @Yakk:您可能会丢失次正规数的数据,因为 /2 会将有效位右移一位而不是更改指数。但是,次正规数小于 1,因此它们可能对这个问题无关紧要(它们不是整数)。
  • @Kevin 是的,相当。我说“任何可以表示为浮点的整数”是有原因的。次正规数不是将任何整数表示为浮点数。因此与我的评论无关(并且,正如您所指出的,与这个问题也无关)。
  • FWIW,这给了1 0 for x=1.5
【解决方案3】:

你的代码可以简化一点:

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

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

【讨论】:

  • 如果 num 是一个数字,因此 num / 2 也是一个数字,为​​什么要使用 parseInt(一个旨在将字符串转换为数字的函数)? (我知道为什么,但我认为你的答案会极大地受益于解释你为什么这样做以及你依靠 parseInt 的什么特殊怪癖来使它工作。)
  • 老实说,var p2 = p1; 比调用parseInt 两次浪费要少得多。
  • 另外,只有当你有一个字符串时才使用parseInt。它不适用于数字。
  • @Bergi 它也适用于数字。但是数字会先转换成字符串,然后解析得到整数。检查这个:jibbering.com/faq/faq_notes/type_convert.html#tcParseIn
  • @AnthonyGrist 我使用 parseInt 只是为了将 float 转换为 int。我的回答不依赖于 parseInt 的任何其他怪癖。我在 JS 方面没有太多经验,因为它不是我的主要语言。我现在已经更新了我的答案。谢谢。
【解决方案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】:

        如果您希望您的输出为consecutive 或完全相同,但又希望'将一个整数分成两个数字',这是你的解决方案:

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

          只有其他解决方案,我认为性能还可以。

          【讨论】:

            【解决方案9】:

            感到懒惰?没问题!

            我很自豪地向你展示了一个生成器对象!

            初始化它并使用它! 每隔一次使用它会自动改变值,即使在同一行!

            用法: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);

            【讨论】:

              【解决方案10】:

              或者这样:)

              var number = 7;
              var part1 = ~~((number / 2) + (number % 2));
              var part2 = ~~(number / 2);
              
              console.log(part1, part2);

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-11-25
                • 2011-10-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-22
                • 2022-01-19
                相关资源
                最近更新 更多