求解:Free Pascal编程

1640 集合取数
时间限制:1000MS 内存限制:65536K
总提交数:61 通过数:36
描述
求集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下:
(1)数1属于M;
(2)如果X属于M,则Y=2*X+1和Z=3*X+1也属于M;
(3)此外再没有别的数属于M。
输入
一行,n (n≤100)
输出
一行,递增次序输出集合M的最小的N个数
输入样例
3
输出样例
1 3 4
拜托,我问的是PASCAL语言……

第1个回答  2010-12-18
能不能告诉我,你的题目出自那个在线测评网站,谢谢
Program lt7_2_1;
uses crt;
var a,b:array[1..1000] of integer;
x,ha,hb,t,total,n:integer;
begin
clrscr;
write('N=');readln(n);
x:=1;a[1]:=1;
ha:=1;hb:=1;t:=0;total:=1;
while total<=n do
begin
write(x:5);
inc(t);
a[t]:=2*x+1;b[t]:=3*x+1;
if a[ha]>b[hb] then begin
x:=b[hb];inc(hb);
end
else begin
x:=a[ha];
if a[ha]=b[hb] then inc(hb);
inc(ha);
end;
inc(total);
end;
end.
分析:可以用两个队列来存放Y和Z中的数,分别用数组a和数组b存放。然后递推求出第N项,方法如下:
(1)令ha和hb分别为队列a和队列b的头指针,它们的尾指针为t。初始时,X=1,ha=hb=t=1;
(2)将2*x+1和3*x+1分别放入队列a和队列b的队尾,尾指针加1。即:
a[t]←2*x+1,b[t]←3*x+1,t←t+1;
(3)将队列a和队列b的头结点进行比较,可能有三种情况:
(A)a[ha]>b[hb]
(B)a[ha]=b[hb]
(C)a[ha]<b[hb]
将比较的小者取出送入X,取出数的队列的头指针相应加1。
(4)重复(2),(3)直至取出第N项为止。

参考资料:http://zlzhb.blog.163.com/blog/static/1860914920072180199146/

第2个回答  2010-12-17
int n=Convert.ToInt32(Console.ReadLine());
string str="";
if(n<=100)
{
for(int i=0;i<n;i++)
{
if(M[i]==1)
{
str+=M[i].ToString();
}else if(X==M[i]&&Y==M[i]*2+1&&Z==M[i]*3+1)
{
str+=" ";
str+=X.ToString();
str+=" ";
str+=Y.ToString();
str+=" ";
str+=Z.ToString();
}
}
Console.Write(str);
}
else
{
Console.Write("输入的不是小于等于100的整数");
}本回答被网友采纳
第3个回答  2010-12-18
竞赛是不能用其它单元的

var
x,y,z:array[1..100] of word;
n,i,ty,tz:word;
begin
y[1]:=1;
z[1]:=1;
for i:=2 to 100 do y[i]:=y[i-1]*2+1;
for i:=2 to 100 do z[i]:=z[i-1]*2+1;
ty:=1;
tz:=1;
for i:=1 to 100 do
begin
if y[ty]>z[tz] then
begin
x[i]:=z[tz];
inc(tz);
end
else
begin
x[i]:=y[ty];
inc(ty);
end;
if x[i]=x[i-1] then i:=i-1;
end;
readln(n);
for i:=1 to n do write(x[i],' ');
end.
第4个回答  2010-12-18
Program lt7_2_1;
uses crt;
var a,b:array[1..1000] of integer;
x,ha,hb,t,total,n:integer;
begin
clrscr;
write('N=');readln(n);
x:=1;a[1]:=1;
ha:=1;hb:=1;t:=0;total:=1;
while total<=n do
begin
write(x:5);
inc(t);
a[t]:=2*x+1;b[t]:=3*x+1;
if a[ha]>b[hb] then begin
x:=b[hb];inc(hb);
end
else begin
x:=a[ha];
if a[ha]=b[hb] then inc(hb);
inc(ha);
end;
inc(total);
end;
end.

Free Pascal 求解
观察题意可以得知,如果第i位和第j位同色,那么就一定能够组成一个三元组,并且三元组的价值完全与中间那个数无关。那么,我们就用一个数组存储同奇偶性的同色方块。那么价值就是(num i+num j)*(i+j)现在把每组的数的下标用a1~an表示,数值用numa1~numan表示。答案就是(numa1+numa2)*(a1+...

free pascal的编程拜托了
var i,j,k:integer;begin for i:=0 to 8 do begin for j:=1 to abs(4-i) do write(' ');for k:=1 to 2*(5-abs(4-i))-1 do write(i div 2);for j:=1 to abs(4-i) do write(' ');writeln;end;readln;end.var i,j,k:integer;begin for i:=1 to 9 do begin...

free pascal编程问题
2.在函数中,函数的返回值可以作为一个变量来处理。比如:function a : longint;begin a:=12;while a>4 do begin {...} end;end;这个例子在Turbo Pascal中,a>4会被认为是函数的递归调用,但是在Free Pascal中会认为a只是一个变量。如果想在Free Pascal中实现递归调用,就要写成下面的形式:fu...

一个超级难的free pascal循环问题
用F[I]表示上到第I级台阶时的方法数 因为F[I]只能由F[I-1],F[I-2],F[I-3]三种状态到达,所以递推式 F[I]=F[I-1]+F[I-2]+F[I-3]Var F:Array[0..10]of Longint;I:Longint;Begin F[0]:=1;F[1]:=1;F[2]:=2;For I:=3 to 10 do F[I]:=F[I-1]+F[I-2]...

关于Free Pascal编程的几个问题。
按alt+F9是编译,按了如果有错会出现如图的界面,会告诉你坐标,说的很清楚了。如果对的话就会提示"press any key";如果你是直接保存,那就在你安装的那个地方,比如说我的装在D:\\FPC里,那文件就在D:\\FPC\\2.4.0\\bin\\i386-win32\\文件夹里面。(扩展名为.pas)...

如何利用free PASCAL正确编写程序
我们以下的示范,是以时下比较流行的Borland Pascal 7.0为例子,其他的编程环境可能略有不同,但大致上是一致的。我们先编一个比较简单的程序,看看程序是如何调试的。program tiaoshi;var i:integer;begin for i:=1 to 300 do begin if i mod 2 = 0 then if i mod 3 = 0 then if i mo...

关于Free Pascal 编程问题
大体思路都是:readln(n);for i:=1 to n do begin ……for j:=1 to … do ……end;关键是如何弄出“……”部分。如:1)图应该是如下:每行的星星数与行号数相同所以就是 for i:=1 to n do begin for j:=1 to i do write('*');writeln;{每做完一行要换行} end;{核心内容就...

求Free Pascal IDE的一个简单程序代码
Begin If NOT ((a MOD b = 0) OR (b MOD a = 0)) Then Continue;{ 两数不能整除就继续下一循环 } he := a + b; { 和 } cha := Abs(a - b); { 差。Abs 求绝对值 } ji := a * b; { 积 } If a > b { 商 } Then shang := a DIV b Else sha...

Free Pascal问题,用函数和过程解。谢谢!
if a>b then tmp:=a;a:=b;b:=tmp;if a>c then tmp:=a;a:=c;c:=tmp;if b>c then tmp:=b;b:=c;c:=tmp;s:=c;end;begin readln(a,b,c);max(a,b,c,s);writeln(s);end.其他的问题我临时没有时间 如果你不急的话 我会在 这周五晚上完整回答 我是个学生。其实...

free pascal编程,帮忙解释一下,假如能提示更简便的方法就给三十分...
第二个:x代表:代表它模拟的这个平方数 第三个:因为99的平方式9801,不到9999,所以是1 to 8 第四个:if语句:这个if语句的判断条件1111*j,因为这个新产生的四位相同数数比模拟的平方数小就做 第五个:if语句:这是判断模拟的平方数减去四位相同数后是否还是一个完全平方数(sqr函数是求平方...

相似回答
大家正在搜