Math 帕斯卡-奇偶数
我想做一个算法,不使用mod、div、odd()等内置函数,返回ginen数是奇数还是偶数。 我制定的唯一解决方案是遵循,但它不太可靠,只适用于大于0的数字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
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=>偶数
请注意,在第一次反转之后,我们在每一步上减少减去的数字,因为我们知道它小于我们减去的数字的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补码在当时是不保证的。