0

我在 pascal 中有一个问题:在下一个序列中生成前 n 个数字:1,1,2,2,2,3,3,3,3,4,4,4,4,4,... 我写了一个这些代码,但问题是它不能按我想要的方式工作。

var
s,c: string;
n,i,j: integer;
begin
 s:='';
 readln(n);
 begin
  for i := 1 to n do
   begin
    if ( length(s)/2 -1 >= n) then
    begin
     Break;
    end;
    for j := 1 to i + 1 do
    begin
     str(i,c);
     s:= s + c+',';
    end;

 end;
end; 
4

4 回答 4

2

Here's a version that is shorter, and also removes the extra comma at the end: It's a full console program (and adds a prompt for the number of elements):

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i, j: Integer;
  s: string;
  nItems: Integer;
begin
  s := '';
  Write('Enter # of elements: ');
  ReadLn(nItems);
  for i := 1 to nItems do
    for j := 1 to i + 1 do
    begin
      s := s + IntToStr(i) + ',';
    end;
  System.Delete(s, Length(s), 1); { Remove final comma )
  WriteLn(s);
  ReadLn;
end.
于 2012-09-17T21:45:19.373 回答
0

我已经解决了我的问题,这是正确的代码,如果你能改进它会很好。

var
s,c: string;
n,i,j: integer;
begin
 s:='';
 readln(n);
 begin
  for i := 1 to n do
   begin

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then
    begin
     Break;
    end;
     str(i,c);
     s:= s + c+',';
    end;

   end;
  end;
 Delete(s,length(s)-2,length(s));
 write(s);
 readln;
 end.
于 2012-09-17T11:30:03.613 回答
0

你可以改变你的内循环:

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then
    begin
     Break;
    end;
     str(i,c);
     s:= s + c+',';
    end;

首先,为了清楚起见,我建议你总是缩进,所以

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then
       begin
        Break;
       end;
     str(i,c);
     s:= s + c+',';
    end;

其次,您只需要beginandend将多个语句转换为单个语句,因此由于您只进入break其中,因此它们是多余的-只需直接使用 break :

    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then Break;
     str(i,c);
     s:= s + c+',';
    end;

接下来,请注意您正在重新计算c很多:

    str(i,c);
    suffix = c + ',';
    for j := 1 to i + 1 do
    begin
     if ( length(s) > n*2  ) then Break;
     s:= s + suffix;
    end;

我不是很热衷于使用 break 因为它感觉像是一个 goto,所以也许你可以把它改成一个repeat ... until块:

    str(i,c);
    suffix = c + ',';
    j := 1;
    repeat 
      s := s + suffix;
      j := j + 1;
    until (j > i+1) or (length (s) > n*2);

(请注意,repeatanduntil带有一个隐含的beginend因此您不需要键入它们。)
现在您可能会争辩说,我降低了清晰度,因为它不那么明显循环只是增加了j. 在这种情况下,无论您喜欢什么,我都不会感到强烈,但是如果您经常使用 break ,请考虑是否whilerepeat您更好。

你的情况length (s) > n*2让我感到困惑(没有其他人把它放在你的代码版本中)。您似乎出于某种原因想缩短它。你确定吗?我不是。下面是你得到的无限制输出的表格,然后是输出的前 n*2 项,以及字符串的前 n*2 个字符,所以你可以检查一下。该break声明的目的是什么?

n:      1
output: 1,1
length: 2
n*2:    2
first n*2 numbers:    1,1
first n*2 characters: 1,

n:      2
output: 1,1,2,2,2
length: 5
n*2:    4
first n*2 numbers:    1,1,2,2
first n*2 characters: 1,1,

n:      3
output: 1,1,2,2,2,3,3,3,3
length: 9
n*2:    6
first n*2 numbers:    1,1,2,2,2,3
first n*2 characters: 1,1,2,

n:      4
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4
length: 14
n*2:    8
first n*2 numbers:    1,1,2,2,2,3,3,3
first n*2 characters: 1,1,2,2,

n:      5
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5
length: 20
n*2:    10
first n*2 numbers:    1,1,2,2,2,3,3,3,3,4
first n*2 characters: 1,1,2,2,2,

n:      6
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,6
length: 27
n*2:    12
first n*2 numbers:    1,1,2,2,2,3,3,3,3,4,4,4
first n*2 characters: 1,1,2,2,2,3,
于 2012-09-17T23:25:31.087 回答
0

我会改变你的外循环的工作方式,所以i指出你在哪个位置,并引入第二个数字element,它代表当前元素。element然后每当内部循环运行时递增。

s:='';
readln(n);
element:=1;
begin
  for i := 1 to n do
  begin
    for j := 1 to i + 1 do
    begin
     str(element,c);
     s:= s + c+',';
    end;
    element:=element+1;
  end;
end;
于 2012-09-17T12:02:50.210 回答