`
xingqiliudehuanghun
  • 浏览: 7237 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

腾讯面试题:计算抽取的数字

阅读更多
/**-------------------------
* n1和n2满足如下条件:
*    1. n1    + n2    = sum;
*    2. n1*n1 + n2*n2 = sqSum;
* 用角坐标表示n1、n2后可以将
* 条件合并为: sqrt(sqSum)*sin(z) + sqrt(sqSum)*cos(z) = sum
* 化 简 为  :1 + 2*sin(z)*cos(z) = sum*sum/sqSum
* 化 简 为  :sin(2*z) = (sum * sum)/sqSum - 1
* 所以弧度为:z = Math.asin( (sum * sum)/sqSum - 1)/2 
* 所以n1    : Math.floor(Math.sin(sqrt(sqSum) * sin(z)))
* 所以n2    : Math.floor(Math.cos(sqrt(sqSum) * sin(z)))
*-------------------------*/

function analyse(){
  //模拟抽取
  var a   = [];
  var max = 100000;
  var n1  = Math.floor(Math.random() * (max+1));
  var n2  = Math.floor(Math.random() * (max+1));
  for(var i=1; i<=max; i++){
      if( i != n1 && i != n2 ){
          a.push(i);
      }
  }

  //计算两数和与平方和
  var sum   = (max + 1)*(max/2);
  var sqSum = max*(max+1)*(2*max+1)/6; //平方和公式: n(n+1)(2n+1)/6
  var num;
  for(var i=0,len=a.length; i<len; i++){
    num    = a[i];
    sum   -= num;
    sqSum -= num*num;
  }

  //计算两数
  var z = Math.asin(sum*sum/sqSum - 1)/2;
  var r = Math.sqrt(sqSum);
  var n3= Math.round(r * Math.sin(z));
  var n4= Math.round(r * Math.cos(z));
  
  //返回
  return [
    [n1, n2].sort().join(','),
    [n3, n4].sort().join(',')
  ]
}

var i, a;
for(i=0; i<1000; i++){
  a = analyse();
  if(a[0] != a[1]){
    console.error(i + '\tnot passed test: ' + a);
  }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics