思路:利用二重循环。
尽管通过一些附加的判断,也能完成本题,但似乎数学的意味少了。
对于本题来说,巧妙利用pascal中的数学函数,可以优化一下代码,就是下面的版本。
min(x,y)表示x,y中较小的那个数;
有7行,最外层就用 i 从1 循环到 7 ;
每行都是输出奇数,1~4行还好判断,输出(2i-1)个(2i-1)就行了;
5~7行稍微麻烦点,通过分析,需要输出 2*min(i,8-i)-1 个 2*min(i,8-i)-1 ,代进去看看:
第6行,i=6,min(i,8-i)的结果是2,因此2*min(i,8-i)-1 的结果是3,即输出3个3,正好符合(这个部分我想了很久)。
至于每行开头空格的个数,其实用一个 abs(4-i) 就可以了。(绝对值函数)
优化版:
uses math; //调用数学库;
var i,j:integer;
begin
for i:=1 to 7 do
begin
for j:=1 to abs(4-i) do write(' '); //输出空格;
for j:=1 to 2*min(i,8-i)-1 do
write(2*min(i,8-i)-1);
writeln;
end;
end.
输出:
1、这种问题弱到爆。能用就结贴,人的基本素质。
2、另外那位搞“优化”的哥们,提点小小建议:您的代码只是长度短了一点点,效率没有提高,反而下降。您知道Abs和Min函数编译展开后多长么?照这个道理我直接用Write输出字符岂不是更短,一行代码就行了。此外如果针对7这个数本身的特性来写程序,是不是太那个了,如果我最大输出的是9呢?或者是字符'Q'呢?
program Rhombus;
const
MAX = 7; {这个数可以改,1~9之间的奇数都行}
var
i, j, step: Integer;
begin
i := 1;
step := 2;
while i > 0 do
begin
for j := 1 to (MAX - i) div 2 do Write(#32);
for j := 1 to i do Write(i);
Writeln;
if i >= MAX then step := -step;
Inc(i, step);
end;
Readln;
end.
哈哈,上学时常弄这个。
program XX;
var
m, n: Integer;
begin
for m := 1 to 7 do
begin
if m mod 2 <> 0 then for n := 1 to m do write(n);
writeln;
end;
for m := 5 downto 1 do
begin
if m mod 2 <> 0 then for n := 1 to m do write(n);
writeln;
end;
end.
现编的,没调试,自己试试吧(我这知道你的题意是否是分行?我加了writeln。如果不是分行就去掉它)