主题:[讨论]意想不到的题目~~~
abcwuhang
[专家分:1840] 发布于 2007-10-14 13:48:00
题目:
给出一个小于2^32的正整数。这个数可以用一个32位的二进制数表示(不足32位用0补足)。我们称这个二进制数的前16位为“高位”,后16位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。
例如,数1314520用二进制表示为0000 0000 0001 0100 0000 1110 1101 1000(添加了11个前导0补足为32位),其中前16位为高位,即0000 0000 0001 0100;后16位为低位,即0000 1110 1101 1000。将它的高低位进行交换,我们得到了一个新的二进制数0000 1110 1101 1000 0000 0000 0001 0100。它即是十进制的249036820。
输入格式 Input Format:一个小于2^32的正整数
输出格式 Output Format:将新的数输出
Sample Input
1314520
Sample Output
249036820
有谁可以用 [em18]最短的程序[em18] 把它做出来???????(很快公布答案!!!)
回复列表 (共11个回复)
沙发
abcwuhang [专家分:1840] 发布于 2007-10-14 13:56:00
其实这题很(蒙人)的哟!!!
板凳
Matodied [专家分:7560] 发布于 2007-10-14 13:58:00
用longint就搞定了!
程序等会发给你。
3 楼
Matodied [专家分:7560] 发布于 2007-10-14 14:11:00
程序:
FUNCTION t_b(t: LONGINT): STRING;
VAR
z, zz: STRING; i, j: INTEGER;
BEGIN
z := '';
WHILE (t > 0) DO BEGIN
i := t MOD 2; t := t DIV 2;
STR(i, zz);
z := zz + z;
END;
FOR j:=1 TO 32 - LENGTH(z) DO z := '0' + z;
t_b := z;
END;
FUNCTION t_d(z: STRING): LONGINT;
VAR
zz: STRING; i, k, s: INTEGER; t, p: LONGINT;
BEGIN
t := 0; p := 1;
FOR i:=32 DOWNTO 1 DO BEGIN
zz := COPY(z, i, 1);
VAL(zz, s, k);
t := t + s * p;
p := p * 2;
END;
t_d := t;
END;
VAR
a: LONGINT; x: STRING;
BEGIN
READLN(a);
x := t_b(a);
x := COPY(x, 17, 16) + COPY(x, 1, 16);
WRITELN(t_d(x));
END.
这题一点也不蒙人!
4 楼
abcwuhang [专家分:1840] 发布于 2007-10-14 14:14:00
PS:最短的程序!!!!!!
(这题很假)
5 楼
Matodied [专家分:7560] 发布于 2007-10-14 14:16:00
这下程序短了一点了:
FUNCTION t_b(t: LONGINT): STRING;
VAR
z, zz: STRING; i, j: INTEGER;
BEGIN
z := '';
WHILE (t > 0) DO BEGIN
i := t MOD 2; t := t DIV 2; STR(i, zz); z := zz + z;
END;
FOR j:=1 TO 32 - LENGTH(z) DO z := '0' + z;
t_b := z;
END;
FUNCTION t_d(z: STRING): LONGINT;
VAR
zz: STRING; i, k, s: INTEGER; t, p: LONGINT;
BEGIN
t := 0; p := 1;
FOR i:=32 DOWNTO 1 DO BEGIN
zz := COPY(z, i, 1); VAL(zz, s, k); t := t + s * p; p := p * 2;
END;
t_d := t;
END;
VAR
a: LONGINT; x: STRING;
BEGIN
READLN(a);
x := t_b(a); x := COPY(x, 17, 16) + COPY(x, 1, 16); WRITELN(t_d(x));
END.
6 楼
abcwuhang [专家分:1840] 发布于 2007-10-14 14:23:00
这其实是老师给我的一个练习题,不过老师好象没有注意到PASCAL中还有一个SWAP函数...结果被我XX了!!
我的超短程序(5行):
program try;
var a:longint;
begin
readln(a);
writeln(swap(a));
end.
7 楼
abcwuhang [专家分:1840] 发布于 2007-10-14 14:23:00
hehe!!!~~
8 楼
abcwuhang [专家分:1840] 发布于 2007-10-14 14:25:00
PS:5楼:你的只不过是把程序尽量塞到一行里去.............................!!
9 楼
Matodied [专家分:7560] 发布于 2007-10-14 14:36:00
如果不让你用SWAP呢?这个程序够短了吧!
(在不用SWAP的情况下,估计这个是最短的了)
TYPE arr = ARRAY[1..32] OF INTEGER;
VAR
s1, s2: arr; i, s: INTEGER; a, p, t: LONGINT; x, xx: STRING;
BEGIN
READLN(a); s := 0; t := 0; p := 1;
WHILE (a > 0) DO BEGIN
i := a MOD 2; a := a DIV 2; s := s + 1; s1[33 - s] := i;
END;
FOR i:=1 TO 32 DO BEGIN
IF i <> 16 THEN s2[i] := s1[(i + 16) MOD 32] ELSE s2[i] := s1[32];
END;
FOR i:=1 TO 32 DO BEGIN t := t + s2[33 - i] * p; p := p * 2; END;
WRITELN(t);
END.
10 楼
shisutianxia [专家分:630] 发布于 2007-10-14 14:58:00
ABCWUHAN你试一下你的程序,同样输入又是不同输出,天啊,刚解决一个类似问题,又来了!!!咋整?????????
我来回复