| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2914 人关注过本帖
标题:【分享】另类的谢宾斯基(Sierpinski)分形三角形输出程序
取消只看楼主 加入收藏
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
结帖率:96.15%
收藏
已结贴  问题点数:20 回复次数:1 
【分享】另类的谢宾斯基(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行的像素版,使用相同的算法:


为什么这么简短的代码有这么神奇的效果?
其实可能你没想到,这个和杨辉三角有直接的关系!
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,能整除的点就挖空,那么结果会。。。。。







如图:



如果是除以5,那么结果会:





使用质数作为除数,就会得到以上很规则的分形,但是,如果不是质数的话,我们用4来尝试,会得到



虽然同样是分形,但像是除以3和除以2两个分形的混合体,而使用其它的合数,将会得到更奇怪的图案:
如下是除以30形成的图案:
" border="0" />


细心观察,你会发现竟然是除以2的图案,除以3的图案,除以5的图案,三个叠加而成,
而30 = 2 * 3 * 5

利用这个特点,我们还可以捣鼓一个很另类素数判定办法哦,给定n,看杨辉三角的第n+1行,除了一头一尾的1,其它数都能被n整除,
如果都能,就是素数,否则就是合数,只是这个判定办法没有任何应用价值罢了


本文章没有任何版权,没有所谓的Copyleft之类玩意,更不遵守什么PL协议,可以随意转载,不需要负担任何责任

[ 本帖最后由 御坂美琴 于 2011-1-17 21:44 编辑 ]
收到的鲜花
  • 卧龙孔明2011-01-24 21:05 送鲜花  10朵  
  • 卧龙孔明2011-01-24 21:05 送鲜花  10朵  
  • 卧龙孔明2011-01-24 21:06 送鲜花  10朵   附言:为什么上限那么小= =
  • 卧龙孔明2011-01-24 21:06 送鲜花  10朵  
  • 卧龙孔明2011-01-24 21:07 送鲜花  10朵  
搜索更多相关主题的帖子: 三角形 控制台 
2011-01-17 21:18
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
其实这里更主要是在讲数学,数学和编程结合的例子,用程序去帮助你更直观地得到一些问题的答案
希望由此帮助其它人提升对学习编程的兴趣

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2011-01-17 23:57
快速回复:【分享】另类的谢宾斯基(Sierpinski)分形三角形输出程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019621 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved