今天到一家公司去应聘,问过一些基础知识后,让我做一道题,关于算法的,我平常不注重算法,所以没有答上。真是郁闷呀。回家后一查原来是第五届全国青少年信息学(计算机)奥林匹克分区联赛普及组复赛试题中的一道。真晕。我都24了难道还是少年组的水平!!!!!唉,难受呀,一会饿补下算法的部份。
把题帖出来大家分享下吧,唉。-------------------------------------------------------------
第一题 Cantor表(30分)
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张
表来证明这一命题的:
1/1 1/2 1/3 1/4 1/5 ...
2/1 2/2 2/3 2/4 ...
3/1 3/2 3/3 ...
4/1 4/2 ...
5/1
我们以z字型给上表的每一项编号。第1项是1/1,然后是1/2,2/1,3/1,2/2...
输入:整数n(1<=n<=10)
输出:表中的第N项
样例:
input: n=7
output: 1/4
把题帖出来大家分享下吧,唉。-------------------------------------------------------------
第一题 Cantor表(30分)
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张
表来证明这一命题的:
1/1 1/2 1/3 1/4 1/5 ...
2/1 2/2 2/3 2/4 ...
3/1 3/2 3/3 ...
4/1 4/2 ...
5/1
我们以z字型给上表的每一项编号。第1项是1/1,然后是1/2,2/1,3/1,2/2...
输入:整数n(1<=n<=10)
输出:表中的第N项
样例:
input: n=7
output: 1/4
我还没说他让我用任何语言print一个 ,唉。
15 16 17 18 1
14 27 28 19 2
13 26 29 20 3
12 25 30 21 4
11 24 23 22 5
10 9 8 7 6
var
i, j, k, n: integer;
begin
i := 1;
n := strtoint(edit1.Text);
while true do
if n > i then
begin
n := n - i;
i := i + 1;
end
else
break;
if i mod 2 = 1 then
begin {j/k}
j := i + 1 -n;
k := n;
end
else
begin
j := n;
k := i + 1 - n;
end;
edit1.Text := inttostr(j) + '/' + inttostr(k);
end;
{
char str[256];
int i = sqrt(2*n);
if(i*(i+1)>=2*n)i--;
int j = n-(i+++1)*i++/2;
if(i%2){
i-=j;
sprintf(str, "%d/%d", j, i);
}
else
{
i-=j;
sprintf(str, "%d/%d", i, j);
}
return str;
}
但偶觉得亦可的想法更能体现计算机解题的方法。
呵呵,一家之言
再看k是奇数还是偶数确定是
再看k是奇数还是偶数确定是u/k还是(k-u)/k