第 102 题:不用加减乘除运算符,求整数的 7 倍

发布于 2022-08-19 08:43:57 字数 76 浏览 139 评论 22

乘法运算相对比较慢,所以快速的方法就是将这个乘法转换成加减法和移位操作。可以将此整数先左移三位(*8)然后再减去原值:X << 3 – X。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(22

一个人的旅程 2022-05-04 13:55:27

相当于7xn个位数
const getSum = (x) => Array.from({ length: 7 }).fill(Array.from({ length: x }, item => 1).join('')).join('').length;

帅气尐潴╰ 2022-05-04 13:55:27

function(n){
Math.abs(~eval([n<<3,~n].join("")))
}
第二个答案,一长串的是第一个答案,还有个构想是用Math.random(),但没写出来。建议写个接口,然后大数据爬出答案,return出来。

酷遇一生 2022-05-04 13:55:27

function qq(n){
var a = n;
for(var i=0;i<6;i=Math.abs(~i)){
for(var j=0;j<a;j=Math.abs(~j)){
n = Math.abs(~n)
}
}
console.log(n);
}

熟人话多 2022-05-04 13:55:27

所有的答案这个最优秀: @Huangyanyang

function Sum(x){
    let arr = Array(x)
    let resultArr = [...arr,...arr,...arr,...arr,...arr,...arr,...arr]
    return resultArr.length
}
哭泣的笑容 2022-05-04 13:55:27

突然觉得这些好有意思

铃予 2022-05-04 13:55:19
const sevenTimes = num => eval(new Array(7).fill(num).join('+'))

sevenTimes(10) // 70
  • 加号字符串不算加号运算符,那我是不是可以。。。eval(${num}*7)
忘羡 2022-05-04 13:55:19

左移3位 相当于乘8 然后再减去自己 不就是7倍了吗 减法的移位运算可以转换加法的移位运算

整数: n

背景知识: -n = ~(n-1) = ~n+1

转换方程

n*7 ==> n<<3-n ==> add(n<<3, ~n+1) ==> add(n<<3, add(~n, 1))

function add(m,n){ 
     return n?add(m^n, (m&n)<<1):m; 
}

add(n<<3,  add(~n, 1))
14

通用场景

不用加减乘除运算符,求整数n的m倍

这个就不难了 哈哈

幻想少年梦_ 2022-05-04 13:54:58

var ab = [];
function seven(n,ten){
if(!n){
ten&&ten==1&&ab.unshift(1);
ten&&ten==2&&ab.unshift(2);
ten&&ten==3&&ab.unshift(3);
ten&&ten==4&&ab.unshift(4);
ten&&ten==5&&ab.unshift(5);
ten&&ten==6&&ab.unshift(6);
}
if(n[n.length-1]==0){
!ten&&ab.unshift(0)&&seven(n.slice(0,n.length-1));
ten&&ten==1&&ab.unshift(1)&&seven(n.slice(0,n.length-1));
ten&&ten==2&&ab.unshift(2)&&seven(n.slice(0,n.length-1));
ten&&ten==3&&ab.unshift(3)&&seven(n.slice(0,n.length-1));
ten&&ten==4&&ab.unshift(4)&&seven(n.slice(0,n.length-1));
ten&&ten==5&&ab.unshift(5)&&seven(n.slice(0,n.length-1));
ten&&ten==6&&ab.unshift(6)&&seven(n.slice(0,n.length-1));
}else if(n[n.length-1]==1){
!ten&&ab.unshift(7)&&seven(n.slice(0,n.length-1));
ten&&ten==1&&ab.unshift(8)&&seven(n.slice(0,n.length-1));
ten&&ten==2&&ab.unshift(9)&&seven(n.slice(0,n.length-1));
ten&&ten==3&&ab.unshift(0)&&seven(n.slice(0,n.length-1),1);
ten&&ten==4&&ab.unshift(1)&&seven(n.slice(0,n.length-1),1);
ten&&ten==5&&ab.unshift(2)&&seven(n.slice(0,n.length-1),1);
ten&&ten==6&&ab.unshift(3)&&seven(n.slice(0,n.length-1),1);
}else if(n[n.length-1]==2){
!ten&&ab.unshift(4)&&seven(n.slice(0,n.length-1),1);
ten&&ten==1&&ab.unshift(5)&&seven(n.slice(0,n.length-1),1);
ten&&ten==2&&ab.unshift(6)&&seven(n.slice(0,n.length-1),1);
ten&&ten==3&&ab.unshift(7)&&seven(n.slice(0,n.length-1),1);
ten&&ten==4&&ab.unshift(8)&&seven(n.slice(0,n.length-1),1);
ten&&ten==5&&ab.unshift(9)&&seven(n.slice(0,n.length-1),1);
ten&&ten==6&&ab.unshift(0)&&seven(n.slice(0,n.length-1),2);
}else if(n[n.length-1]==3){
!ten&&ab.unshift(1)&&seven(n.slice(0,n.length-1),2);
ten&&ten==1&&ab.unshift(2)&&seven(n.slice(0,n.length-1),2);
ten&&ten==2&&ab.unshift(3)&&seven(n.slice(0,n.length-1),2);
ten&&ten==3&&ab.unshift(4)&&seven(n.slice(0,n.length-1),2);
ten&&ten==4&&ab.unshift(5)&&seven(n.slice(0,n.length-1),2);
ten&&ten==5&&ab.unshift(6)&&seven(n.slice(0,n.length-1),2);
ten&&ten==6&&ab.unshift(7)&&seven(n.slice(0,n.length-1),2);
}else if(n[n.length-1]==4){
!ten&&ab.unshift(8)&&seven(n.slice(0,n.length-1),2);
ten&&ten==1&&ab.unshift(9)&&seven(n.slice(0,n.length-1),2);
ten&&ten==2&&ab.unshift(0)&&seven(n.slice(0,n.length-1),3);
ten&&ten==3&&ab.unshift(1)&&seven(n.slice(0,n.length-1),3);
ten&&ten==4&&ab.unshift(2)&&seven(n.slice(0,n.length-1),3);
ten&&ten==5&&ab.unshift(3)&&seven(n.slice(0,n.length-1),3);
ten&&ten==6&&ab.unshift(4)&&seven(n.slice(0,n.length-1),3);
}
}
写不下去了,我感觉在下头发都在摇曳了,胸口憋了一口闷气。

此生挚爱伱 2022-05-04 13:52:45

虽然这样做没什么技术含量,但至少符合题意吧哈哈
function(x){
let arr = Array(x)
let resultArr = [...arr,...arr,...arr,...arr,...arr,...arr,...arr]
return resultArr.length
}

鬼才哈哈

メ斷腸人バ 2022-05-04 13:47:05
function bit_add(a, b){
  var carry = a & b;
  var noCarrySum = a ^ b;
  if(carry)
    return bit_add(carry << 1, noCarrySum);
  else
    return noCarrySum;
}
function bit_multiply7(a){
  return bit_add(a<<2, bit_add(a<<1, a));
}
bit_multiply7(999999)
纸伞微斜 2022-05-04 13:29:21

function multiple(data){
var v = new Array(Number(data.num)+1).join('*')
var mul= data.multiple-1
console.log(v,mul)
return RegExp('^((.)(2{'+mul+'}))+$','gm').test(v)
}
multiple({
multiple:7,
num:'77'
})

初相遇 2022-05-04 13:24:34

虽然这样做没什么技术含量,但至少符合题意吧哈哈
function(x){
let arr = Array(x)
let resultArr = [...arr,...arr,...arr,...arr,...arr,...arr,...arr]
return resultArr.length
}

秀儿 是你吗

风吹雪碎 2022-05-04 13:15:02

function getNum(num, count) { return eval(new Array(count).fill(num).join('+')); } getNum(7,3) // 21 getNum(7,4) // 28 借鉴楼层 比较高明. 学习了~

蓝咒 2022-05-04 12:14:55
var multip0 = num => ''.padEnd(num).repeat(7).length
var multip1 = num => [0, 7, 14, /*我有一个绝佳的想法, 可惜这里地方太小写不下...*/][num]
var multip2 = num =>new Array(num).fill().map(()=> new Array(7).fill()).flat().length
画骨成沙 2022-05-04 11:47:43

''.padEnd(5, 0).replace(/0/g, ''.padEnd(7, 0)).length // 5 * 7 = 35
正则实现数学运算

ぽ尐不点ル 2022-05-04 10:46:08

仅供娱乐

function nTimes(m, n) {
	const con = document.createElement('div');
	const child = document.createElement('div');

	con.style.setProperty('width', `${m}px`);
	child.style.setProperty('width', `${n}00%`);
	con.appendChild(child);
	document.body.appendChild(con);

	setTimeout(() => document.body.removeChild(con));
	
	return child.clientWidth;
}

nTimes(10, 7); // 70
世界和平 2022-05-04 09:02:06
const sevenTimes = num => new Array(7).fill(num).reduce((p,v)=> p+v)

sevenTimes(10) // 70

you used + , which is not allowed.

You are right...

木有鱼丸 2022-05-04 08:59:49

function getNum(x){ let a = Array(x << 3).fill(1);a.splice(0,x); return a.length; } console.log(getNum(2)) // 14

始终不够 2022-05-04 08:27:37
const sevenTimes = num => new Array(7).fill(num).reduce((p,v)=> p+v)

sevenTimes(10) // 70

you used + , which is not allowed.

情何以堪。 2022-05-04 06:28:30

涨姿势

薄荷梦 2022-05-04 05:27:58
const sevenTimes = num => eval(new Array(7).fill(num).join('+'))

sevenTimes(10) // 70
橘味果▽酱 2022-05-03 06:00:35

可以使用三类方式:位运算加法、JS hack、进制转换。实现方式分别如下:

/* -- 位运算 -- */

// 先定义位运算加法
function bitAdd(m, n){
    while(m){
        [m, n] = [(m & n) << 1, m ^ n];
    }
    return n;
}

// 位运算实现方式 1 - 循环累加7次
let multiply7_bo_1 = (num)=>
{
  let sum = 0,counter = new Array(7); // 得到 [empty × 7]
  while(counter.length){
    sum = bitAdd(sum, num);
    counter.shift();
  }
  return sum;
}

// 位运算实现方式 2 - 二进制进3位(乘以8)后,加自己的补码(乘以-1)
let multiply7_bo_2 = (num) => bitAdd(num << 3, -num) ;

/* -- JS hack -- */

// hack 方式 1 - 利用 Function 的构造器 & 乘号的字节码
let multiply7_hack_1 = (num) => 
    new Function(["return ",num,String.fromCharCode(42),"7"].join(""))();

// hack 方式 2 - 利用 eval 执行器 & 乘号的字节码
let multiply7_hack_2 = (num) => 
		eval([num,String.fromCharCode(42),"7"].join(""));

// hack 方式 3 - 利用 SetTimeout 的参数 & 乘号的字节码
setTimeout(["window.multiply7_hack_3=(num)=>(7",String.fromCharCode(42),"num)"].join(""))

/* -- 进制转换 -- */

// 进制转换方式 - 利用 toString 转为七进制整数;然后末尾补0(左移一位)后通过 parseInt 转回十进制
let multiply7_base7 = 
    (num)=>parseInt([num.toString(7),'0'].join(''),7);

贴一个自己之前发布过的这个题的解法和思路逻辑:
frontend9/fe9-library#272

~没有更多了~

关于作者

花期渐远

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

daid

文章 0 评论 0

我心依旧

文章 0 评论 0

晒暮凉

文章 0 评论 0

微信用户

文章 0 评论 0

DS

文章 0 评论 0

〆凄凉。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文