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

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字 = =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值