回 帖 发 新 帖 刷新版面

主题:[讨论]意想不到的题目~~~

题目:
给出一个小于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个回复)

沙发

其实这题很(蒙人)的哟!!!

板凳

用longint就搞定了!
程序等会发给你。

3 楼

程序:
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 楼

PS:最短的程序!!!!!!
(这题很假)

5 楼

这下程序短了一点了:
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 楼

这其实是老师给我的一个练习题,不过老师好象没有注意到PASCAL中还有一个SWAP函数...结果被我XX了!!
我的超短程序(5行):
program try;
var a:longint;
begin
  readln(a);
  writeln(swap(a));
end.

7 楼

hehe!!!~~

8 楼

PS:5楼:你的只不过是把程序尽量塞到一行里去.............................!!

9 楼

如果不让你用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 楼

ABCWUHAN你试一下你的程序,同样输入又是不同输出,天啊,刚解决一个类似问题,又来了!!!咋整?????????

我来回复

您尚未登录,请登录后再回复。点此登录或注册