[英]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)中运行。 其他一些想法:
检查最后一个数字是否为0、2、4、6、8(如果数字以字符串/数组形式给出,则非常好)在算法的每个步骤中,增加减去的数字,直到达到负数,然后逆转该过程。 例如,假设我们要检查64:
因此是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.