繁体   English   中英

Pascal-奇数和偶数

[英]Pascal - odd and even number

我想制作一种算法,该算法无需使用诸如mod,div,odd()之类的内置函数即可返回ginin数为奇数还是偶数。 我只能提出一个唯一的解决方案,但是它并不是很可靠,仅适用于大于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.

谢谢您的帮助。

好吧,要使其与负数一起使用,您只需检查数字是否为负,如果为负,则乘以-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倍。 当然,您可以创建大量的变体,其中一些变体可能更有效。

我从未真正使用过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;

如果数字为奇数,则其最后一位为1,否则为0。 您可以使用按位运算符对整数(1)进行测试,该整数表示为0..00001。

我的Pascal技能有些生锈,但是应该有些相似:

var
  n: integer;
begin
  readln(n);
  if(n&1 = 1) then
    writeln('odd')
  else
    writeln('even');
end. 

你可以使用cos吗? 如果是这样,请尝试

abs(cos(n*1.570796326794896619231321691639751442)) > 0.9

它实际上应该是= 1但我们不能使用π/ 2的理想值,并且cos会出现小误差。

您可以使用数字截断:

var
  n: integer;
begin
  readln(n);
  if(n-(n/2)*2 = 1) then
    writeln('odd')
  else
    writeln('even');
end. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM