【分享】另类的谢宾斯基(Sierpinski)分形三角形输出程序
所谓的谢宾斯基(Sierpinski)分形三角形,是如下图所示的三角形在这个帖子 https://bbs.bccn.net/thread-329542-1-1.html 里
介绍了一种随机生成的方法生成这个图,而现在,我将要介绍一种更另类的生成办法
这个办法,用的是控制台输出,但代码简单的要命:
#include <stdio.h>
int main()
{
int i, j, n = 25; //要输出的行数
for (i = 0; i < n; i++)
{
for (j = 0; j <= n; j++)
putchar( (i & j) == j ? '*' : ' ');
puts("");
}
getchar();
return 0;
}
以上代码的输出结果:
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
如果我们增加输出的行数,那么可以得到更为壮观的输出(以下是64行的输出):
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
********************************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
**************** ****************
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
******** ******** ******** ********
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
**** **** **** **** **** **** **** ****
* * * * * * * * * * * * * * * *
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
****************************************************************
当然,如果你觉得字符太大了,改用像素点的绘画,那可以画出更大的三角形
以下是一个700行的像素版,使用相同的算法:
" border="0" />
为什么这么简短的代码有这么神奇的效果?
其实可能你没想到,这个和杨辉三角有直接的关系!
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
注意,这里把偶数标记为红色,你发现了什么?如果你还没发现,你继续列下去就看出来了
而,n个数选k个,即C(n, k)能被2整除的充要条件就是 (n&k) != k
而C(n, k)打印成表就正是杨辉三角
好吧,看似毫不相关的位运算,竟然和组合数,还有杨辉三角扯上重要的关系
===========================================我是性感的分割线========================================================
假如,我们对杨辉三角,不是按整除2来标记,而改成其它数字,那么,会出现什么结果呢?
比如,除以3,能整除的点就挖空,那么结果会。。。。。
如图:
" border="0" />
如果是除以5,那么结果会:
" border="0" />
使用质数作为除数,就会得到以上很规则的分形,但是,如果不是质数的话,我们用4来尝试,会得到
" border="0" />
虽然同样是分形,但像是除以3和除以2两个分形的混合体,而使用其它的合数,将会得到更奇怪的图案:
如下是除以30形成的图案:
" border="0" />
细心观察,你会发现竟然是除以2的图案,除以3的图案,除以5的图案,三个叠加而成,
而30 = 2 * 3 * 5
利用这个特点,我们还可以捣鼓一个很另类素数判定办法哦,给定n,看杨辉三角的第n+1行,除了一头一尾的1,其它数都能被n整除,
如果都能,就是素数,否则就是合数,只是这个判定办法没有任何应用价值罢了
本文章没有任何版权,没有所谓的Copyleft之类玩意,更不遵守什么PL协议,可以随意转载,不需要负担任何责任
[ 本帖最后由 御坂美琴 于 2011-1-17 21:44 编辑 ]