循环打印算法:不拘一格编程序之一

不拘一格编程序之一
循环打印算法
做者:朱云翔
 
    小说中常常有人说某某将领打仗天马行空,不拘一格,让敌人防不胜防,好比《×××》中的李牧;好比《大唐双龙传》中的寇少。
    编程序时也要有怎样的思想,不能被条条框框所束缚,好比这个例子:
    【例1】编写一个函数void fun(int t),要求在屏幕上打印t个“*”号,其中t的长度不会大于50。

【设计1】:
void fun( int t)
{
         if (t<0 || t>50) return;
         switch(t)
        {
                 case 1: printf( "*"); break;
                 case 2: printf( "**"); break;
                此处删除500字
                 case n: printf( "*****......**"); break;
        }
}
以上方法虽然笨拙,可是时间复杂度为O(1),快!这是牺牲空间换取时间。
固然,编写设计一的人员通常很少,绝大多数人使用设计2。
 
【设计2】:
void fun( int t)
{
         int i;    
         if (t<0 || t>50) return;
         for(i=0;i<t;i++) printf( "*");        
}
以上算法是最正宗的算法!优势是:程序至关简单,思路至关清晰。缺点是时间复杂度为O(t)。
 
设计3】:
void fun( int t)
{
         char     *p= "****************************************************************************************";
         char buf[51];
         if (t<0 || t>50) return;
        memcpy(buf, p, t);
        buf[t]=0;
        printf(buf);        
}
乍一看,真麻烦,可是时间复杂度O(1)。有人说,那前面的memcpy等代码就不耗费时间了吗?答曰:一、memecpy的时间花费远远printf等屏幕显示类函数底。二、就算是空循环体的for循环再编译后也会产生若干行表明,比memcpy要慢。
可是这里增长了p和buf的存储空间。
 
【设计4】
void fun( int t)    
{    
                 char    *p;    
                 if (t<0 || t>50) return;    
                 if (!(p = ( char *)malloc(t+1))) return;
                memset(p, '*', t);
                p[t]=0;    
                printf(p);    
                free(p);
                 return;                
}
与设计3相似,但与其相比,减小了多余的空间浪费,可是去增长了malloc内存分配操做和memset内存设置操做,相对增长了时间耗费。时间复杂度O(1)。
 
    编写软件不拘一格,并非要你编什么程序都剑走偏锋,而是说当走普通的路不通的时候,或者很是难走时,别完了试试其它的路。就像以上算法,各自有其优缺点,都有其本身的适用范围,切勿只用一种包打天下,也切勿为了眩耀而使用不适用的算法。
 
相关文章:不拘一格编程序之一循环打印算法  
          不拘一格编程序之二俄罗斯方块新增行算法
                  不拘一格遍程序之三 变量取值交换算法
                              不拘一格编程序之四 循环的各类形式
相关文章
相关标签/搜索