Javascript最不常见的多功能对于非常大的数字而言是失败的

时间:2018-01-26 13:15:37

标签: javascript algorithm

我有一个lcm函数,对于非常大的数字而言是失败的,但不是更小的数字。例如,在(6,8)的输入上,它返回24作为lcm。但是,如果我执行诸如(2000000000,1999999999)之类的操作,我的while循环将无限循环,并且不会返回任何内容。

我正在使用一个大整数库来处理大数字,但它似乎并没有起作用。这是代码:

Fri Jan 26 2018 11:28:55 GMT+0000 (GMT): GET /users/reset/6e2574bfa532e0d13af7fae61114308f9a683767
Mongoose: users.findOne({ resetPasswordExpires: { '$gt': new Date("Fri, 26 Jan 2018 11:28:55 GMT") }, resetPasswordToken: '6e2574bfa532e0d13af7fae61114308f

9a683767' }, { fields: {} })
Fri Jan 26 2018 11:28:55 GMT+0000 (GMT): GET /favicon.ico
Fri Jan 26 2018 11:29:02 GMT+0000 (GMT): POST /users/reset/6e2574bfa532e0d13af7fae61114308f9a683767
Mongoose: users.findOne({ resetPasswordExpires: { '$gt': new Date("Fri, 26 Jan 2018 11:29:02 GMT") }, resetPasswordToken: '6e2574bfa532e0d13af7fae61114308f
9a683767' }, { fields: {} })
Mongoose: users.update({ _id: ObjectId("5a5c6740b9e210087e098fd6") }, { '$unset': { resetPasswordExpires: 1, resetPasswordToken: 1 } })
Mongoose: users.update({ _id: ObjectId("5a5c6740b9e210087e098fd6") }, { '$unset': { resetPasswordExpires: 1, resetPasswordToken: 1 } })
(node:1451) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'apply' of undefined
    at /Users/benbagley/Code/poetry-out-loud/node_modules/es6-promisify/dist/promisify.js:75:41
    at new Promise (<anonymous>)
    at /Users/benbagley/Code/poetry-out-loud/node_modules/es6-promisify/dist/promisify.js:54:20
    at /Users/benbagley/Code/poetry-out-loud/routes/users.js:321:5
    at model.Query.<anonymous> (/Users/benbagley/Code/poetry-out-loud/node_modules/mongoose/lib/model.js:4056:16)
    at /Users/benbagley/Code/poetry-out-loud/node_modules/kareem/index.js:273:21
    at /Users/benbagley/Code/poetry-out-loud/node_modules/kareem/index.js:131:16
    at process._tickCallback (internal/process/next_tick.js:150:11)
(node:1451) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a c
atch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1451) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminat
e the Node.js process with a non-zero exit code.
Fri Jan 26 2018 11:29:02 GMT+0000 (GMT): GET /users/forgot
events.js:136
      throw er; // Unhandled 'error' event
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at validateHeader (_http_outgoing.js:503:11)
    at ServerResponse.setHeader (_http_outgoing.js:510:3)
    at ServerResponse.header (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/response.js:767:10)
    at ServerResponse.location (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/response.js:884:15)
    at ServerResponse.redirect (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/response.js:922:18)
    at req.login.loginError (/Users/benbagley/Code/poetry-out-loud/routes/users.js:332:13)
    at /Users/benbagley/Code/poetry-out-loud/node_modules/passport/lib/http/request.js:51:48
    at /Users/benbagley/Code/poetry-out-loud/node_modules/passport/lib/sessionmanager.js:16:14
    at pass (/Users/benbagley/Code/poetry-out-loud/node_modules/passport/lib/authenticator.js:297:14)
    at Authenticator.serializeUser (/Users/benbagley/Code/poetry-out-loud/node_modules/passport/lib/authenticator.js:299:5)
    at SessionManager.logIn (/Users/benbagley/Code/poetry-out-loud/node_modules/passport/lib/sessionmanager.js:14:8)
    at IncomingMessage.req.login.req.logIn (/Users/benbagley/Code/poetry-out-loud/node_modules/passport/lib/http/request.js:50:33)
    at user.save (/Users/benbagley/Code/poetry-out-loud/routes/users.js:330:11)
    at /Users/benbagley/Code/poetry-out-loud/node_modules/mongoose/lib/model.js:4056:16
    at /Users/benbagley/Code/poetry-out-loud/node_modules/mongoose/lib/services/model/applyHooks.js:170:20
    at process._tickCallback (internal/process/next_tick.js:150:11)

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你的算法太慢了。使用 var svg = d3.select("#svg"); var placePositionX = svg.select("#" + id).attr("cx"); var placePositionY = svg.select("#" + id).attr("cy"); translate = [ placePositionX, placePositionY ]; var g = svg.select("g").attr("transform", "translate(" + translate + ")" + " scale(" + scale + ")") n1=2000000000,它会进行20亿次n2=1999999999次呼叫。您可以使用以下公式:

add

要计算lcm(a, b) = a * b / gcd(a, b) (最大公约数),您需要实现基于分区的Euclidian algorithm版本。递归实现:

gcd(a, b)

其他实现(如果你想避免递归)可以在这里找到:JS how to find the greatest common divisor

答案 1 :(得分:0)

如果你使用这个package,那么你很幸运 - 它有一个内置的lcm方法:link to the docs

如果您想查看它的实现,请查看Github存储库中的源代码。

在上述库中实现该方法:Source

希望这可以帮助你:)