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

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

Spring编程式事务管理

在基于数据库的应用中,事务是非常重要的。为了方便使用,Spring提供了基于XML和基于注解的方式配置事务,思路都是使用AOP,在特定的切入点统一开启事务,以方法为粒度进行事务控制。并且定义了事务的传...
  • honglei915
  • honglei915
  • 2016年03月10日 20:40
  • 6138

Spring编程式事务实现

编程式事务概述        所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。        Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务...
  • zmx729618
  • zmx729618
  • 2016年04月08日 10:35
  • 1879

Mybatis3和Spring3整合下的编程式事务管理

大家都知道在对数据库操作时,最重要的就是要保证业务的原子性和一致性,这样才能基本保证数据库中数据的正确性。就比如说,某个系统中有两张表,一个是用户表users,另一个是用户的基本信息表users_in...
  • ymh198816
  • ymh198816
  • 2015年01月27日 04:08
  • 2549

Spring的四种事务管理(一种编程式事务+三种声明事务)<学习随笔>

Spring的4种事务管理(1种编程式事务+三种声明事务) 一、Spring事务的介绍 二、编程式事务xml的配置 ...
  • liuwenbiao1203
  • liuwenbiao1203
  • 2016年09月05日 14:18
  • 6896

事务声明声明式事务和编程式事务介绍

编程式事务:所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManag...
  • u013083576
  • u013083576
  • 2016年06月24日 17:41
  • 7236

Spring 编程式事务和申明式事务选择和使用小结

1.选择编程式事务管理还是声明式事务管理:     当你只有很少的事务操作时,编程式事务管理通常比较合适。例如,如果你有一个Web应用,其中只有特定的更新操作有事务要求, 你可能不愿使用Sprin...
  • Heng_Ji
  • Heng_Ji
  • 2015年02月11日 15:31
  • 1354

深入解读Spring Framework事务管理(第二弹:编程式事务管理的使用方式)

Spring Framework提供了两种方式的编程式事务管理: 1. 使用TransactionTemplate 2. 直接使用PlatformTransactionManager的一个实现 ...
  • lianjiww
  • lianjiww
  • 2016年12月28日 14:09
  • 515

Spring事务管理实现方式之编程式事务与声明式事务详解

1.编程式事务:编码方式实现事务管理(代码演示为JDBC事务管理) Spring实现编程式事务,依赖于2大类,分别是上篇文章提到的PlatformTransactionManager,与模版类Tran...
  • liaohaojian
  • liaohaojian
  • 2017年04月12日 09:49
  • 4626

Spring Mvc那点事---(32)Spring编程式事务的实现

上一节我们介绍了spring 事务中的相关接口,这一节我们看看怎么利用接口通过编程式来使用事务控制。使用TransactionTemplate来实现编程式事务控制。使用TransactionTempl...
  • zx13525079024
  • zx13525079024
  • 2016年07月30日 15:39
  • 810

Python程序的执行过程 解释型语言和编译型语言

转载地址:http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html 1、C++和C都是属于编译型语言,本来的.c文件都是用高级语言编写的,...
  • lujiandong1
  • lujiandong1
  • 2015年11月27日 11:30
  • 2243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转贴]程式設計的省思 - 功力篇
举报原因:
原因补充:

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