不拘一格編程序之一
循環打印算法
作者:朱雲翔
小說中經常有人說某某將領打仗天馬行空,不拘一格,讓敵人防不勝防,比如《尋秦記》中的李牧;比如《大唐雙龍傳》中的寇少。
編程序時也要有怎樣的思想,不能被條條框框所束縛,比如這個例子:
例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等代碼就不耗費時間了嗎?答曰:1、memecpy的時間花費遠遠printf等屏幕顯示類函數底。2、就算是空循環體的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)。
編寫軟件不拘一格,並不是要你編什麼程序都劍走偏鋒,而是說當走普通的路不通的時候,或者非常難走時,別完了試試其它的路。就像以上算法,各自有其優缺點,都有其自己的適用范圍,切勿只用一種包打天下,也切勿為了眩耀而使用不適用的算法。
相關文章:不拘一格編程序之一循環打印算法
不拘一格編程序之二俄羅斯方塊新增行算法
不拘一格遍程序之三變量取值交換算法 不拘一格編程序之四循環的各種形式
本文出自 “編程浪子朱雲翔” 博客,請務必保留此出處http://zhuyunxiang.blog.51cto.com/653596/128441