我有一个我一直遇到麻烦的作业问题。
我必须编写一个函数来检查给定数字中的每个交替数字是否具有相同的奇偶校验。例如, 1 2 3 3和2 1 3 3 都有效,但1324不是。不过,我不知道该怎么做。一件事我如何跟踪先前的数字?任何帮助将不胜感激。
编辑:到目前为止我的努力:
任何数字< 100显然是不可接受的(对吧?),因为“每个交替的数字”在这里并没有真正意义。对于3位数字,这应该有效:
function validate(n) {
var i, copy, l = [0, 0];
if (isNaN(n) || (n < 100)) {
return false;
} else {
copy = Math.round(n);
for (i = copy.toString().length; i--; n = Math.floor(n / 10)) {
l[0] = l[1];
l[1] = l[2];
l[2] = n % 10;
}
if ((l[0] % 2) == (l[2] % 2)) return true;
}
}
编辑[2]:感谢大家的帮助。我已经设法根据Salix alba的第一个建议来保持第一和第二位的奇偶校验,从而获得真实的(我思考)工作函数。循环在数字上向后运行。
目前,这个(以及进行一些小修改以保存最后和倒数第二位的数字而不是Salix alba所说的,这会使parity =
行变得更简单)是我的解决方案:
function validate(n) {
var copy, len, parity, broke = 0, i = 2;
if (!isNaN(n) || (n >= 100)) {
n = Math.round(n);
len = n.toString().length;
copy = n; // save
parity = Math.floor(n / Math.pow(10, len - 1)) % 2;
n = Math.floor(n / 10);
while (i < len) {
if (parity != ((n % 10) % 2)) {
broke++;
break;
}
i += 2;
n = Math.floor(n / 100);
}
n = copy; // restore
i = 1;
parity = (Math.floor(n / Math.pow(10, len - 2)) % 10) % 2;
while (i < len) {
if (parity != ((n % 10) % 2)) {
broke++;
break;
}
i += 2;
n = Math.floor(n / 100);
}
if (broke != 2) return true;
}
return false;
}
当然,这是一个可怕的混乱。我真的非常感谢任何让它更有效,更容易阅读的想法等。
(还试图用jing3142的方法编写另一个函数,用标志迭代,可能使循环更简单。)
答案 0 :(得分:0)
您正在沿着正确的方向努力,但存在许多问题。您的代码仅适用于三位数,因为您的检查if ((l[0] % 2) == (l[2] % 2)) return true;
仅在循环结束时运行一次。
所以你需要设置一个标志,比如说valid
并将valid = valid && ((l[0] % 2) == (l[2] % 2))
放在循环中。
循环现在会失败,因为l[2]
中l[1] = l[2]
的第一次使用将是未定义的,因为它尚未定义。
如果你更正了这些,那么你需要检查是否有偶数或奇数位数,否则它将因奇数位数而失败。
另外,你在评论中暗示你不要使用字符串,而在实践中,即使它只是为了找到长度,你也会这样做。
还有另一种方式。
你的训练中的线索是,如果n <100则不能进行检查,并且在循环时你需要每次通过n = Math.floor(n / 10)
减少n为10倍。
在你提出建议时,不是给你一个解决方案,而不是一个解决方案,这是一个提示。
假设n> 100开始,如果U是单位数,T十位数和H百位数n然后当n> 100时如何计算U和H,那么如何设置有效标志,循环?
编辑看起来你还需要一些帮助
Algorithm not code
function validate(n) {
if(n<100) return not applicable
valid=true
while(n>100) {
U=n % 10
H=Floor(n /100) % 10
valid = valid && ((U % 2) == (H % 2))
n=Floor(n/10)
}
return valid
}