- UID
- 50356
注册时间2008-5-1
阅读权限20
最后登录1970-1-1
以武会友
 
该用户从未签到
|
前天看这个Nisy老大打印这东西的时候写的很轻松,自己看完视频写了下发现还是自己对于菱形中, "*"这个小东西的相互位置关系还是
不能很清晰的把握。所以自己就用数学的关系来好好的解释下。自己的数学比较菜,也算是对自己思路的一种梳理。
这里首先还是定义两个变量: i,j。分别代表行号和列号;同时定义行中间的行号为F,为了适应其他的奇数,所以定义变量N
昨天论坛里的一朋友说i,j变量定义从0开始比较好计算关系。所以我们就用i=1;j=1为起始(这里起始用0也是同理可以推出)
这里我们另外设两个变量x,y,让他们帮助确定i,j之间的关系。先取N=5的情形作为实例,其他奇数可以类推。
我们先算下各个位置下的i,j的关系(依据图 1),
菱形PYG.rar
(9.44 KB, 下载次数: 24)
菱形左边 菱形右边
第一行 i=1时, j=3 j=3
第二行 i=2时, j=2 j=4
第三行 i=3时, j=1 j=5
第四行 i=4时, j=2 j=4
第五行 i=5时, j=3 j=3
我们注意菱形左面和右面j相加的结果为一个定值N+1.
好了,相当于我们知道了10个坐标(i,j),我们来引进我们的数学关系式来确定i与j的关系
中间行号F的值为(N/2+1)
设 j=abs(F-i+x)+y,然后把F,i和j的值带进去,得到的二元一次方程组为:
3=abs(3-1+x)+y 即 3=abs(2+x)+y
2=abs(3-2+x)+y 即 2=abs(1+x)+y
1=abs(3-3+x)+y 即 1=abs(0+x)+y
2=abs(3-4+x)+y 即 2=abs(-1+x)+y
3=abs(3-5+x)+y 即 3=abs(-2+x)+y
计算下就可以发现取 x=0,y=1可以满足上面的等式。所以
计算得出了,菱形左边的i,j之间的关系为:j=abs(F-i)+1
所以菱形右面的i,j之间的关系随之确定j=(N+1)-(abs(F-i)+1),即j=N-abs(F-i)
源程序就是下面的了
/* Note:i,j start from 1 */
#define N 13
#define F (N/2+1)
#include "math.h"
#include "stdio.h"
main()
{
int i,j;
for(i=1;i<=N;i++)
{
for(j=1;j<N+1;j++)
{
if((j==(abs(F-i)+1))||(j==(N-abs(F-i))))
printf("*");
else
printf(" ");
if(j==N)
printf("\n");
}
}
}
[ 本帖最后由 kelvar 于 2009-5-18 13:02 编辑 ] |
|