急!!!pascal题目!

1.设有N个不同整数的数列:例如N=4时,有4个不同整数的数列为17,4,16,5。数列中的第1个数17,比它后面的三个数都大,则称数17的逆数为3。数列中的第2个数4比它后面的数都小,则称数4的逆数为0。同时记数列中全部逆数的和称为数列的逆数。上例中,数列17,4,16,5的逆数:为3+0+1+0=4。当给出N个不同整数的数列后,求出此数列的逆数。如输入N=5,35 17 8 6 25,则输出7 。
2.阶乘是数学中的一种运算,N的阶乘表示为:N!=1*2*3*4*……*N,编写程序,根据一个给出的N,求得其阶乘值中所有数字之和P。并判断P是否为素数。
[输入输出]
输入:键盘输入一个自然数N(1<=N<=12)。
输出:N的阶乘值的所有数字之和P,若P为素数输出“T”,否则输出“F”。
[样例1] [样例2]
输入:5 输入:12
输出:3□T 输出:27□F
3.给定一行整数,请把这一行整数从小到大排序(整数个数小于1000)。
输入文件:PX。IN,包括一行数据,为若干个整数。输出文件:PX。OUT,包括一行从小到大的整数序列,每两个整数用空格分开。
样例:PX。IN
8 2 3 4 6 1 7 9 3
PX。OUT
1 2 3 3 4 6 7 8 9 9
4.聪明的囚犯:传说从前有一个残暴的国王,喜欢杀戮百姓。有一次,他抓到30个百姓并要一一杀掉。在这30个百姓中间有一个聪明人,他站出来对国王说:“请国王打发慈悲,赦免两个人不死。”国王问:“赦免哪两个人不死?”那个聪明人回答说:“我们30个人围成一圈,从1开始报数,凡数到5的人就拉出去杀掉,剩下的人继续从1开始报数,循环反复,直到剩下两个人为止,这两个人被赦免。”国王一听很有意思,就同意了聪明人的建议,叫这30个百姓围成一圈,依依报数,凡数到5的就杀掉。最后只剩下两个人没有被杀掉,而聪明人就是其中之一。编写程序,由计算机判断一下,聪明人要站在什么位置,才能躲过这场屠杀。
若有人全解出这4道题,定有悬赏。(+100~+200)

第一题最弱的方法时间复杂度仅仅是
(n-1)*n/2
就是枚举每个数
然后看它后面有多少个数比它大嘛!
数据小的话很容易过的!
就像这样:
for i:=n downto 1 do
for j:=i+1 to n do
if a[i]>a[j] then inc(f[i]);
ans:=0;
for i:=1 to n do ans:=ans+f[i];
数据大的话就用优化
设数列为
a b c d e f
设f>d>e
所以d的逆数为1
设c>d那么c的逆数就是2
可见,若d的逆数为n
当c>d时,c的逆数将是n+1
上述的是粗略的证明
不够精确
但是很难文字证明
反正通俗易懂
就是利用不等式的传递性嘛
所以:
for i:=n downto 1 do
for j:=i+1 to n do
if a[i]>a[j] then begin
f[i]:=f[j]+1;
break;
end;
ans:=0;
for i:=1 to n do ans:=ans+f[i];
第二题12!不大
完全可以直接算出来
然后转成字符串
然后逐位转为数字加起来
然后判断质数就是了嘛
k:=1;
for i:=1 to n do k:=k*i;
str(k,s);
x:=0;
for i:=1 to length(s) do begin
val(s[i],j);
x:=x+j;
end;
write(x,' ');
for i:=2 to trunc(sqrt(x)) do
if x mod i=0 then begin
writeln('F');
halt;
end;
writeln('T');

halt表示将整个程序结束
所以与下面的输出T不冲突
如果没有进到if语句里面
那么就是OK嘛
所以下面输出就可以了
不喜欢的自己搞boolean类型的标记
第三题最简单
一个快排就搞定了
最弱的话冒泡也可以啊
快排:
proccedure qsort(x,y:longint);
var i,j,mid:longint;
begin
i:=x;j:=y;
mid:=a[(x+y)div 2];
repeat
while a[x]<mid do inc(x);
while a[y]>mid do dec(y);
if x<=y then begin
a[0]:=a[x];
a[x]:=a[y];
a[y]:=a[0];
inc(x);dec(y);
end;
until x>y;
if i<y then qsort(i,y);
if x<j then qsort(x,j);
end.
第四题类似约瑟夫环
站的位置是含有质因数5最多且小于n的数
i:=1;
repeat
i:=i*5;
until i>n;
i:=i div 5;
i就是答案

最好你要记得你说过要悬赏100~200!
不然RP会降低的!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-08-12
1.根据归并排序的算法有O(nlogn)的算法,下面这个是O(n^2)的
var
n,i,j,ans:integer;
a:array[1..10000]of integer;
begin
read(n);
for i:=1 to n do read(a[i]);
for i:=1 to n-1 do for j:=i+1 to n do if a[i]>a[j] then inc(ans);
writeln(ans);
end.

2.
var
n,i,p:integer;
s:longint;
st:string;
begin
read(n);
s:=1;for i:=2 to n do s:=s*i;
str(s,st);
for i:=1 to length(st) do p:=p+ord(st[i])-48;
for i:=2 to sqrt(p) do
if p mod i=0 then begin writeln(p,' F');halt;end;
writeln(p,' T');
end.

3.由于元素只有1000个,O(n^2)的算法就能过
var
n,i,j,t:longint;
a:array[1..1000]of longint;
begin
assign(input,'PX.in');reset(input);
assign(output,'px.out');rewrite(output);
while not(eof) do
begin
inc(n);
read(a[n]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then
begin t:=a[i];a[i]:=a[j];a[j]:=t;end;
for i:=1 to n-1 do write(a[i],' ');writeln(a[n]);
close(input);close(output);
end.

4.
var i,n:longint;
begin
n:=30;
i:=1;
repeat
i:=i*5;
until i>n;
i:=i div 5;
writeln(i,' ',i div 5);
end.

自己写的,一定加分哦
第2个回答  2009-08-08
优化:
program temp;
var
n,i,j,t:longint;
a:array[1..1000]of longint;
begin
assign(input,'PX.in');reset(input);
assign(output,'px.out');rewrite(output);
while not(eof) do
begin
inc(n);
read(a[n]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then
begin t:=a[i];a[i]:=a[j];a[j]:=t;end;
for i:=1 to n-1 do write(a[i],' ');writeln(a[n]);
close(input);close(output);
end.

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网