我想制作一个算法,它返回ginen number奇数或偶数,而不使用mod,div,odd()等内置函数。 我只编写了一个解决方案,但它不是很强大,只适用于高于0的数字
Var
n: integer;
begin
ReadLn(n);
While (n not in [1, 0]) do
n:=n-2;
if n = 1 then
WriteLn('odd')
else
WriteLn('even');
end.
感谢您的帮助。
答案 0 :(得分:2)
好吧,为了使其能够使用负数,您只需检查数字是否为负值,如果是,则乘以-1
(或只使用abs
)。
算法的唯一问题是效率;在o(n)中运行。其他一些想法:
检查最后一位数字是否为0,2,4,6,8(如果给出的数字为真,则非常好 字符串/数组)在算法的每一步中增加 减去数字直到你达到负数然后反转过程。对于 例如,假设我们要检查64:
所以10步而不是63步 请注意,在第一次反转之后,我们减少每一步的减去数量,因为我们知道它小于我们减去的数字的2倍。当然,您可以创建大量的变体,其中一些可能更有效。
答案 1 :(得分:0)
如果数字为奇数,则其最后一位为1,否则为0。您可以使用按位运算符来测试整数(1),它表示为0..00001。
我的Pascal技能有点生疏,但它应该是类似的东西:
var
n: integer;
begin
readln(n);
if(n&1 = 1) then
writeln('odd')
else
writeln('even');
end.
答案 2 :(得分:0)
您可以使用cos
吗?如果是这样,请尝试
abs(cos(n*1.570796326794896619231321691639751442)) > 0.9
它应该是= 1
但是我们不能使用π/ 2的完美值,并且cos中会有一个小错误...
答案 3 :(得分:0)
我从未真正使用过J& W Pascal,但我知道很多位操作运算符都缺失了。
然而,我确实使用了Pascal的后继者Modula2,而在M2中,我将一个整数转换为相同大小的集合。如果这也适用于经典Pascal那么你可以做
Type
TIntBitset = [0..31]; // or whatever your word size is.
if 0 in TIntBitSet(i) then
begin
(* odd! *)
end;
答案 4 :(得分:0)
您可以使用数字截断:
var
n: integer;
begin
readln(n);
if(n-(n/2)*2 = 1) then
writeln('odd')
else
writeln('even');
end.