解救(rescue.pas,rescue.c,rescue.cpp) pascal

Zerg包围了你的城市,并准备对在此举行祭旗仪式。
仪式是这样举行的:n个祭品(就是人类)编号1...n,排成一圈,从1号开始,每隔一个,便将一个祭品送进Spawning Pool(就是把人变成虫子的地方啦),直到最后剩下一个人,Zerg会把他放掉。Zerg认为这样做会给他们的战争带来好运。
现在,没有丝毫反抗能力的你为了活命,必须站在那个最后被剩下的位置。幸好你手中有一台电脑,它可以帮你迅速决定站在哪里。

Input: rescue.in
第1行 一个正整数k(1<=k<=30000),表示下面有k组测试数据。
以下k行 每行一个正整数n(1<=n<=30000),表示n个人被抓来祭旗
注意: 有50%的数据k<=500。

Output:rescue.out
共k行 对于输入的每个n输出一个正整数,表示应该站在哪个位置能生还。

Sample Input:
3
5
10
100

Sample Output:
3
5
73

如果只有2^n个人的话一定是一号那就先报走一些让剩余的是2^n,第一个就是所求的
主程序如下:
readln(k);
for i:=1 to k do
begin
readln(x);
j:=1;
while j<=x do j:=j*2;
j:=j div 2;
writeln((x-j)*2+1);
end;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-09
var f:array[1..30000]of longint;
l,n,i:longint;

begin
readln(n);
l:=1;
for i:=1 to 30000 do
if l<=i then begin f[i]:=l; inc(l,2); end
else begin f[i]:=1; l:=3; end;
for i:=1 to n do
begin
readln(l);
writeln(f[l]);
end;
end.