帕斯卡 - 奇数和偶数

时间:2013-12-10 14:09:16

标签: math numbers pascal

我想制作一个算法,它返回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.

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

好吧,为了使其能够使用负数,您只需检查数字是否为负值,如果是,则乘以-1(或只使用abs)。

算法的唯一问题是效率;在o(n)中运行。其他一些想法:

  • 检查最低有效位(可能是最后一位)
  • 2的整数除法(可以通过除法和截断来完成) 将结果乘以2并检查它是否是相同的数字
  • 检查最后一位数字是否为0,2,4,6,8(如果给出的数字为真,则非常好 字符串/数组)在算法的每一步中增加 减去数字直到你达到负数然后反转过程。对于 例如,假设我们要检查64:

    1. 64 - 2 = 62,它是> 0但不是0或1
    2. 63 - 4 = 58,> 0,而不是0/1
    3. 50 - 8 = 42,> 0,不是0/1
    4. 42 -16 = 26,> 0,而不是0/1
    5. 26-32 = -6,< 0 =>反向
    6. 26 -16 = 10,> 0,而不是0/1
    7. 10 - 8 = 2,> 0,而不是0/1
    8. 2 - 4 = -2,< 0 =>反向
    9. 2 - 2 = 0,= 0 =>甚至

所以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.