我正在尝试挑战,以便练习,学习和更好地理解编码。我遇到了一个难,并决定尝试,只是为了看。幸运的是没有时间限制。挑战是(如果你愿意,你可以跳过)
&#34;使用JavaScript语言,让函数KaprekarsConstant(num)获取传递的num参数,该参数将是一个包含至少两个不同数字的4位数字。您的程序应对数字执行以下例程:按降序排列数字并按升序排列(添加零以使其适合4位数字),并从较大的数字中减去较小的数字。然后重复上一步。执行此例程将始终使您达到固定数字:6174。然后执行6174上的例程将始终为您提供6174(7641 - 1467 = 6174)。您的程序应返回此例程必须执行的次数,直到达到6174。例如:如果num为3524,则程序应返回3,原因如下:(1)5432 - 2345 = 3087,(2)8730 - 0378 = 8352,(3)8532 - 2358 = 6174。&#34; < / p>
(coderbyte)
工作了很长一段时间后,我发现了一些我想象的东西会起作用。虽然我无法测试循环,因为如果我这样做,我无法重新运行代码,因为循环不完整,永远不会完成处理。完成后,我测试了它。不管我做了什么,我都得0。如果我输入了字母,我会收到错误,会发生什么,但无论我输入什么数字,即使是示例中的4位数字。
这是我的代码:
function KaprekarsConstant(num) {
var forD = [];
var sNum = num.toString();
var result = 0;
var chngdN = [];
var trkr = 0;
for (var i = 0; i < sNum.length; i ++) {
forD.push(+sNum.charAt(i));
}
for (var j = 0; j < sNum.length; j ++) {
chngdN.push(+sNum.charAt(j));
}
while(while(forD-chngdN === trkr){
forD = trkr.toString();
chngdN = trkr.toString();
forD = forD.split("");
chngdN = chngdN.split("");
forD = forD.sort();
chngdN = chngdN.sort();
forD = forD.reverse();
forD = forD.join("");
chngdN = chngdN.join("");
forD = parseFloat(forD);
chngdN = parseFloat(chngdN);
trkr = forD - chngdN;
forD = trkr.toString();
chngdN = trkr.toString();
result = result +1;
}
// code goes here
return result;
}
// keep this function call here
KaprekarsConstant(readline());
&#13;
我刚开始,所以我真的不知道这里有什么问题。如果有人能告诉我出了什么问题,我会很高兴。 (我知道这听起来似乎我似乎并不理解其中任何一个,但我真的只是没有掌握我所学到的一切。我在短时间内学会了这一切。 提前谢谢。
答案 0 :(得分:0)
以下将解决问题,第一个版本实际上并不是要求的实现,但这个是。
我使用了以下内容:
递归(函数调用自身直到达到预期结果)
Array.from和Number.prototype.toString以确保数字字符串的长度为4个字符。
Ternary operator,其方向是sortNum的参数,可以升序或降序排序。
const makeAtLeast4 = num =>
//number to string make sure you have a string that's 4 characters (add 0 if not)
num.toString() +
Array.from(//create an array from someghing
new Array(//that something is a new array
//the lenght of this array is 4 minus the length of the string
4-num.toString().length),
()=>"0"//for each item of the array insert the string "0"
).join("");//join this array (num 111 will be sring "1110")
//create ascending or descending sorted number
// if direction is 1 it's ascending
const sortNum = (numString,direction) =>
parseInt(
(direction === 1)
//if direction is 1 do ? else do :
? numString.toString().split("").sort().join("")
: numString.toString().split("").sort().reverse().join("")
,10//decimal number
);
//take number, sort digits descending and ascending
// substract ascending from descending
const descending_minus_ascending = num => {
const stringNum = makeAtLeast4(num);
return sortNum(stringNum) - sortNum(stringNum,1)
}
const kaprekarsConstant = (num,times=0) => {
//get result for this number
const result = descending_minus_ascending(num);
//if result is the same as the number, return times tried
if(result === num){
return times
}
console.log(`Try:${times+1}, result:${result}`);
//try again with the result and increase times tried by one
// recursively call this function
return kaprekarsConstant(result,times+1);
}
console.log(kaprekarsConstant(11))
<强> [UPDATE] 强>
这是作为while循环的代码,我建议你避免任何类型的循环,直到你使用了递归和数组函数,这些可能需要更长的时间来学习,但让你更容易理解代码长期:
const kaprekarsConstant = (num) => {
//get result for this number
// !! notice that result is not a constant but a var
// we will have keep re assigning it, this can be confusing
// in complex code and should be avoided if possible
// with recursion we don't need to do this
var result = descending_minus_ascending(num);
var times=0;
//keep re assigning result until it's same as num
while(result !== num){
console.log(`Try:${times+1}, result:${result}`);
result = descending_minus_ascending(num);
}
return times;
}