Math 帕斯卡-奇偶数

Math 帕斯卡-奇偶数,math,numbers,pascal,Math,Numbers,Pascal,我想做一个算法,不使用mod、div、odd()等内置函数,返回ginen数是奇数还是偶数。 我制定的唯一解决方案是遵循,但它不太可靠,只适用于大于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

我想做一个算法,不使用mod、div、odd()等内置函数,返回ginen数是奇数还是偶数。 我制定的唯一解决方案是遵循,但它不太可靠,只适用于大于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,否则为0。您可以使用位运算符对整数(1)进行测试,该整数表示为0..00001

我的帕斯卡技能有些生疏,但应该是类似的:

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

好的,要使它适用于负数,你只需检查数字是否为负数,如果为负数,则用
-1
(或只使用
abs
)相乘即可

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

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

  • 64-2=62,它大于0,但不是0或1
  • 63-4=58,>0,而不是0/1
  • 50-8=42,>0,而不是0/1
  • 42-16=26,>0,而不是0/1
  • 26-32=-6,反向
  • 26-16=10,>0,而不是0/1
  • 10-8=2,>0,而不是0/1
  • 2-4=-2,相反
  • 2-2=0,=0=>偶数
因此,将63步改为10步。

请注意,在第一次反转之后,我们在每一步上减少减去的数字,因为我们知道它小于我们减去的数字的2倍。当然,您可以创建大量的变体,其中一些可能更有效

你能用cos吗?如果是,试试看

abs(cos(n*1.570796326794896619231321691639751442)) > 0.9

它应该是
=1
,但我们不能使用π/2的完美值,cos中会有一个小错误…

我从未真正使用过J&W Pascal,但我知道缺少很多位操作运算符

然而,我确实使用了Pascal的后续模块2,在M2中,一个整数被转换为一个相同大小的集合。如果这也适用于经典的Pascal,那么您可以这样做

Type 
  TIntBitset = [0..31]; // or whatever your word size is.

if 0 in TIntBitSet(i) then 
  begin
  (* odd! *)
  end;

您可以使用数字截断:

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

为什么不直接使用
如果(n和1)=1,那么
?@Michael,
是一个布尔运算符而不是位运算符。至少不是原来的帕斯卡语。@lhf:好的。我已经将近15年没有编写Pascal了,所以我只是在互联网上查找了一个运算符表(显然是针对FreePascal的,但我认为它对Turbo Pascal也是有效的)。使用C语法…if((n>>1)这应该是'if n and 1=1然后writeln('odd')或者writeln('偶数')在J&W Pascal中没有逻辑and,只有布尔and。二进制机器和2s补码在当时是不保证的。