-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 102 题:不用加减乘除运算符,求整数的7倍 #161
Comments
可以使用三类方式:位运算加法、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);
贴一个自己之前发布过的这个题的解法和思路逻辑: |
const sevenTimes = num => eval(new Array(7).fill(num).join('+'))
sevenTimes(10) // 70 |
涨姿势 |
you used + , which is not allowed. |
|
You are right... |
仅供娱乐 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 |
|
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 |
|
秀儿 是你吗 |
function multiple(data){ |
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) |
鬼才哈哈 |
var ab = []; |
|
左移3位 相当于乘8 然后再减去自己 不就是7倍了吗 减法的移位运算可以转换加法的移位运算 整数: n背景知识: 转换方程
function add(m,n){
return n?add(m^n, (m&n)<<1):m;
}
add(n<<3, add(~n, 1))
14 通用场景不用加减乘除运算符,求整数n的m倍 这个就不难了 哈哈 |
相当于7xn个位数 |
function(n){ |
function qq(n){ |
所有的答案这个最优秀: @Huangyanyang
|
突然觉得这些好有意思✈😄 学到了🙆
测试机😝
|
不能出现加减乘除,如果你这可以,不如直接 7*n .... |
|
哈哈哈哈 笑死我了。。。 |
算是参考前面的,也不知道是不是已经有这个办法了。
|
轉乘 7 進位向左位移, 再轉回 10 進位
|
方法很不错哈,但是使用了+,不然就完美了 |
// 定义数字0: // 定义数字1: // 定义加法: // 计算数字2 = 1 + 1: // 计算数字3 = 1 + 2: // 计算数字5 = 2 + 3: // 你说它是3就是3,你说它是5就是5,你怎么证明? // 呵呵,看这里: // 给3传一个函数,会打印3次: // 给5传一个函数,会打印5次: |
function seventimes(x){ |
var x = [].concat(...([...new Array(num)].map(x => [...new Array(7)]))) |
`
|
佩服佩服,是什么驱使着你 |
我太菜了🙂 |
估计这就是作者出这题的意图了。就是考虑进制转换。不过,需要指出的是,Number的toString方法,参数值最终为2到36的整数(不符合的会报错。小数会取整,字符串会转成数字),估计是考虑到数字和字母的组合吧。 |
// 不用四则运算
// 加法:
// 递归实现
function add(m, n){
return n ? add(m^n, (m & n)<<1) : m;
}
// 迭代实现
function add2(m, n){
while(m) { // 直到没有进位
[m, n] = [(m & n) << 1, m ^ n];
}
return n;
}
// 乘法:
// 整数n的m倍
function multi(n, m){
var i = 0
var res = 0;
while (m != 0) { // 乘数为0则结束
// 处理乘数当前位
if((m & 1) === 1){
res = add(res, n<<i);
m = m>>1;
i = add(1, i); // i记录当前位是第几位
}else{
m = m>>1;
i = add(1, i);
}
}
return res;
} |
"use strict";
/**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2019-08-14
*
* @description auto-sevent-times-without-math.js
* @description 不用加减乘除运算符, 求整数的7倍
* @description js array get sum value without call math methods
* @augments
* @example eval([1,2,3].join('+'));// 6
* @link https://stackoverflow.com/questions/1230233/how-to-find-the-sum-of-an-array-of-numbers
*
*/
let log = console.log;
const autoSevenTimes = (int = 0, times = 7, debug = false) => {
let result = [];
if (!int) {
return 0;
} else {
for (let i = 0; i < times; i++) {
result.push(int);
}
}
// result = result.reduce((acc, item) => acc + item);
result = eval(result.join(`+`));
if(debug) {
log(`result = `, result);
}
return result;
};
let num = 3;
autoSevenTimes(num);
// expect: 3 * 7 = 21 bitwise-operatorhttps://repl.it/@xgqfrms/bitwise-operator-and-left-shift-and-right-shift const autoSeventTimes = (num = 0, times = 7) => {
let x = Math.floor(times / 2);
return (num << x) - num;
};
let xyz = autoSeventTimes(3);
// 21
console.log(`xyz =`, xyz); |
typed array
const result = [].concat(...([...new Uint8Array(num).map(item => item = 1)].map(x => [...new Uint8Array(7).map(item => item = 1)])));
console.log(result, result.length); |
涨姿势 |
let a="aaaaa" |
全都是大佬,全是二进制。 function seven(num, len) {
return Array.from({ length: len }).fill(Array.from({ length: num }).fill(num)).flat().length;
}
console.log(seven(3, 7)); |
剽窃智慧的感觉真的很爽,感觉天才好多,大约总结出6种方法1、就是位运算加法;2、eval处理方法(fromCharCodeAt(42),以及Array(7).fill(num))3、进制转转换,数字转为7进制进一位在转为10进制 4、数组方法,根据位运算左移三位,则是8倍的数字,出去本身就是7倍的数组,返回length ,5、竟然想到dom元素子结点宽度设置倍数的关系。6、 循环7次Array(m)的数组concat,点赞为各位 |
|
const times7 = x => '1'.repeat(x).repeat(7).length |
..... 考基础 😊 let num = 2;
Array(7).fill(Array.from({ length: num })).flat().length; |
const num = 5; |
const getTimes=(num,time)=> "1".repeat(num).repeat(time).length; |
var n = 10
Array.from({length: 7}).fill(n).reduce((a, b) => a+b, 0) |
function setNumber(number){ |
while取余7次
|
const add = (a, b) => {
if (a === 0) return b
if (b === 0) return a
return add(a ^ b, (a & b) << 1)
}
const sum = (n) => {
return add(n << 3, -n)
}
console.log(sum(9)) |
const calc = num => Array.from({ length: 7 }).reduce((ret, cur) => ret.concat(Array.from({ length: num })), []).length; |
位运算 + 剔除数组
思路
实现const addFnByBit = function (m) {
const res = new Array(m << 3)
for (let i = 0; i < m; i++) {
res.pop()
}
// res.splice(0, m)
return res.length
}
console.log(addFnByBit(5)) |
太强了 |
|
思路:将此整数先左移三位(*8)然后再减去原值:X << 3 – X。 function multipleOfSeven(x) {
return (x << 3) - x;
}
for (let i = 1; i < 10; i++) {
console.log(i, multipleOfSeven(i));
}
// 1 7
// 2 14
// 3 21
// 4 28
// 5 35
// 6 42
// 7 49
// 8 56
// 9 63 |
No description provided.
The text was updated successfully, but these errors were encountered: