[转贴]程式設計的省思 - 功力篇

转载 2006年06月02日 19:27:00

programmer-club看到不错的文章,所以转了过来。
原文链接:http://www.programmer-club.com/pc2020v5/forum/ShowSameTitleN.asp?URL=N&board_pc2020=c&id=28308

程式是死的,人是活的,如何看別人的程式功力,並不是寫得很難懂,或者用了很多技術
而是對程式用心度,跟思考模式與別人不同。
目前以最常見的質數做為參考範本:
#include <stdio.h>
void main(void)
{
int i,j,k;
for(i=1;i<1000;i++)
{
k=1;
for(j=2;j<i;j++)
{
if(i%j == 0)
{
k=0;
break;
}
}
if (k)
printf("%d/t",i);
}
}
通常,別人就以為最完美了,因為目標已經達到了
但是,會用心多思考的人就會想到
1.質數不會被2的相關倍數整除
所以
for(i=1;i<1000;i++)
就會直接改成
for(i=1;i<1000;i+=2)
這樣子,程式速度直接翻轉快上一倍

通常,這個樣子,大家就滿足了
因為這樣就非常快了,也達到目的了
還有更快的方法嗎?

答案是還有的,為什麼?
質數並不會被自己的二倍以上整除所以程式碼又會改成
for(j=2;j<i;j++)
改成
for(j=2;j<(i/2);j++)
程式碼又在度加速
這樣子,滿足了吧?
還有沒有更快的方法嗎?
答案是還有
這時就開始奇怪了? 同樣的程式寫法很多種,一樣的功能寫出來的程式"效能"確差那麼多?
原因就在多用心
#include <stdio.h>
#define SIZE 3000
void a(void)
{
time_t start,end;
int k;
int count = 2;
int str[65550];
str[1] = 2;
str[2] = 3;
start = time(NULL);
for (int i=3;i<SIZE;i +=2)
{
k = 1;
for (int j=1;j<count;j++)
{
if ((i % str[j]) == 0)
{
k = 0;
break;
}

}
if (k)
{
printf("%d/t",i);
str[count++] = i;
}
}
}
這樣子比之前的程式更快上許多倍 ?
為什麼?只是多用個陣列而已差別在那裡?
原因很簡單,因為質數不會被整除,所以不能整除的放在陣列內,就不需要重覆運算到其他不必要的數值
這次算到20 就不會多算到 4,6,8,9,10,12,14,15,16,18這些數值,而直接換算到陣列內的2,3,5,7,11,13,17,19足足少了一半以上的時間,如果算到破萬或者更多時,所需要的時間則減少更為明顯
通常,這樣子? 滿足了吧? 非常快了吧?
在試著把程式碼
for (int j=1;j<count;j++)
改成
for (int j=1;j<(count/2)+1;j++)
又在快上非常多.....
為什麼呢?
因為質數不會被自己的二倍數以上整除,所以直接陣列除2

至於,還有沒有更快的方法,就大家在自己發覺嚕
所以,同樣寫一個程式,有不同的深度,多看別人的程式,別人的思考模式,增進自己的程式功力,也是不錯的方法。
上面的程式,並沒用上什麼華麗的技巧,或者很難懂的語法,相信,很多初學者都早會的東西,但是要用上,不見得會用。
所以寫程式多用點心,講求務實,並不是華麗的技巧,程式碼寫得很難懂,並不表示很強
相同的,自己解決不了的問題,不要光一味的問別人,多深度去思考。
因為,程式學到的並不是程式語法,記很多函式,表示很強,重點在程式、邏緝觀念
當你要解決問題時,第一個要想的是,如果沒有函式(function)怎麼辨到的?
曾今,我寫程式寫很久,乎然想到一件事,如果我的程式碼上並沒有 int , 乘號(*)時,我怎麼運算?
答案是完全不會=_=寫程式很久的人,常常會向上跑,向下跑的人反而少,越覺得理所當然的事,越是乎略掉他。
今天少掉一個for 你要怎麼運算迴圈?原理又如何辨到的?
以前,我在從vb到 c 時,在工作上最常去問其他高深的工程師,我要達到什麼功能,有沒有什麼函式可用,常得到的都是說,自己寫=_=
VB上常遇到的 A=1,A= "a" + "b"; 是理所當然的字串合併,為什麼c就那麼麻煩?
但是沒去想過,VB怎麼辨到的? 換成是你? 你辨得到嗎?
以上只是個人寫程式的想法,並沒有任何的指責,或者說自己很強。
其實我也並不怎麼強
乎2000字 = =

相关文章推荐

Google 手機程式設計

Google 手機程式設計序2007 年 10 月,Google Phone 即將出現的傳聞吵得沸沸煬煬,2007年11月12日,Google 終於公布答岸,原來、Google 並非要做手機,而是直接...
  • myspor
  • myspor
  • 2011-03-30 19:59
  • 2016

Asp.net 程式设计基础篇

ASP.NET 程式设计基础篇

  • 2006-02-23 15:31
  • 8.27MB
  • 下载

追求神乎其技的程式设计之道(六)

最近新玩具太多,差点让我的blog被N82系列文章淹没了。幸亏即时看到qing兄两篇不错的文章,让我决定还是来早点把这个系列写完,不然就快变富奸了。 qing兄的两篇文章指出程式员的两种型态,一...

ASP.NET 程式设计基础篇.pdf

  • 2008-12-01 15:37
  • 8.27MB
  • 下载

ASP.NET 程式设计基础篇.pdf

  • 2008-04-11 11:54
  • 8.27MB
  • 下载

X Window 程式设计入门

http://cnpa.yzu.edu.tw/~thinker 作者:李圭烽 (Thinker; Thinker.bbs@bbs.yzu.edu.tw) (2001-06-02 18:08:00) ...

ASP.NET 程式设计基础篇

  • 2008-09-29 22:12
  • 7.20MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)