編輯推薦
《程序員的數學思維修煉(趣味解讀)》 持續熱銷,一年4次印刷!一本專門為程序員而寫的數學書,訓練數學思維,增強職場競爭力
書中沒有羅列晦澀難懂的數學公式和推導,而是代之以生動有趣的數學實例
讀者不必精通高深的數學知識,隻需要具備四則運算和基本的邏輯思維即可閱讀
趣談110個數學實例,並給齣瞭33個具體的程序代碼實現
內容通俗易懂,講解娓娓道來,風格活潑自然,版式新穎,讀來親切自然
《妙趣橫生的算法(C語言實現)第2版》 算法入門經典熱銷書全新升級,第1版圖書被大量信息學競賽學員作為學習教材
5.5小時教學視頻、114個經典算法題、61個算法麵試題和4個ACM競賽題
幫您開闊眼界,培養編程興趣,提高編程能力,增強求職競爭力
提供瞭5.5小時算法入門專題教學視頻,學習起來比較直觀
提供瞭28個數據結構及算法基礎知識實例,便於讀者入門
提供瞭86個經典、有趣、貼近生活、實用性強的算法實例
提供瞭61個算法及數據結構麵試題,增強求職者的競爭力
提供瞭4個經典的ACM程序設計競賽題目,便於讀者瞭解
書中的所有實例用C語言實現,便於讀者驗證和加深對C語言的理解
既涵蓋瞭算法的基本理論知識,又包含瞭大量實例,寓理論於實踐之中
海報:
內容簡介
《程序員的數學思維修煉(趣味解讀)》 《程序員的數學思維修煉(趣味解讀)》是一本專門為程序員而寫的數學書,介紹瞭程序設計中常用的數學知識。本書門檻不高,不需要讀者精通很多高深的數學知識,隻需要讀者具備基本的四則運算、乘方等數學基礎知識和日常生活中的基本邏輯判斷能力即可。本書拒絕枯燥乏味的講解,而是代之以輕鬆活潑的風格。書中列舉瞭大量讀者都很熟悉,而且非常有趣的數學實例,並結閤程序設計的思維和算法加以剖析,可以訓練讀者的數學思維能力和程序設計能力,進而拓寬讀者的視野,增強職場競爭力。
《程序員的數學思維修煉(趣味解讀)》共11章,分彆介紹瞭數據的錶示、神奇的素數、遞歸、排列組閤、用餘數進行數據分組、概率、復利、數理邏輯、推理、幾何圖形構造、統籌規劃等程序設計中常用的數學知識,從而引導讀者深入理解編程中的數學方法和思路。本書包含的實例有結繩記事、孿生素數、梅森素數、哥德巴赫猜想、階乘、漢諾塔、斐波那契數列、乘法原理、加法原理、字符編碼、密碼長度、日曆中的數學、心靈感應魔術、約瑟夫環、智叟分牛、百枚錢幣鼓士氣、莊傢的勝率、中奬概率、用概率方法求π值、復利的威力、對摺紙張、捨罕王的賞賜、三段論、選言推理、假言推理、關係推理、花盆擺放、殘缺棋盤、丟失的綫條、田忌賽馬、背包問題等。
《程序員的數學思維修煉(趣味解讀)》適閤廣大程序設計人員及數學愛好者閱讀,尤其適閤有一定程序設計經驗,但還需要進一步加深對程序設計理解的人員閱讀。本書對IT求職人員、信息學競賽和大學生程序設計競賽等參賽學員也有很好的參考價值。
《妙趣橫生的算法(C語言實現)第2版》 《妙趣橫生的算法(C語言實現 第2版)》是深受廣大讀者好評的《妙趣橫生的算法(C語言實現)》一書的全新升級版。本書在第1版的基礎上對原書內容做瞭大量的調整和補充,並將書中的實例代碼在Visual Studio 2010環境下重新編譯通過,以適應當前技術的發展和閱讀需求。本書內容涵蓋瞭算法入門的必備基礎知識和大量的趣味算法題、麵試題和ACM競賽題等。通過學習本書內容,可以開闊讀者的視野,幫助讀者理解算法,提高編程興趣和能力,並提高C語言編程能力,還可以讓讀者瞭解IT麵試中的常見算法題及編程競賽中的相關知識。另外,本書提供瞭5.5小時配套教學視頻和實例源代碼,以提高讀者的學習效率。
本書共11章,分2篇。第1篇為算法基礎,包括數據結構基礎知識(8個趣題)、常用的查找與排序方法(9個趣題)、常用的算法思想(11個趣題)。第2篇為常用算法實例解析,包括20個編程基本功趣題、39個數學趣題、14個數據結構趣題、7個數值計算趣題、6個綜閤題、61個算法設計與數據結構麵試題、4個ACM程序設計競賽題目。
本書適閤學習算法的人員作為入門教程,也適閤有C語言基礎的人作為編程實踐讀物,還可作為有編程經驗的程序員查閱相關算法實現和數據結構知識的參考書。另外,本書也可以為那些準備參加IT麵試和信息學競賽的讀者提供有益的幫助。
本書贈送的教學視頻內容
數據結構專題(36分鍾)
查找和排序算法專題(75分鍾)
常用算法專題(63分鍾)
重點編程實例解析專題(89分鍾)
重點麵試題解析專題(65分鍾)
作者簡介
周穎,畢業於電子科技大學。高級程序員、某軟件公司的技術總監。擅長C和C++語言,對數據結構和算法有深入的研究。長期從事行業軟件設計和團隊管理工作,已十年有餘。有著豐富的IT架構設計經驗和行業谘詢經驗。負責過多個大型軟件項目的開發工作。
楊峰,目前就職於中國石化信息技術培訓中心,主要負責ERP係統的底層數據交換業務。有近10年的C語言開發經驗。曾經參與過基於內容的圖像檢索係統、圖書館信息管理係統、基於ARM的嵌入式密碼係統和基於VHDL的硬件時鍾設備等。齣版過兩部C語言圖書。
精彩書評
★本書與專業的數學書籍不同,意在啓發程序設計人員的思維。書中沒有大篇幅的理論和公式推導,這使得本書簡單易懂。而且書中各章節的內容與現實生活緊密結閤,閱讀起來趣味橫生。推薦給對程序設計感興趣的人員,一定大有裨益。
——深圳亞鼎科技有限公司信息係統部總監 方擎
★這是一本為程序員朋友們寫的數學書,淺顯易懂,適閤入門。閱讀者不需要掌握高深的數學知識,具有初中數學知識就可以讀懂本書。書中介紹瞭編程中常用的數學知識,藉以培養初級程序員的數學思維。
——IBM中國商業價值研究院高級分析師 劉京華
★雖然我自己不是程序員,但是我覺得即使不打算往程序員方嚮發展的人,也可以從這本書中獲得很多思維模式上的幫助。書中的內容相當生動形象,而且是用非常淺顯易懂的語言來講解。書中介紹的數學知識也與我們的生活息息相關,這使得本書內容非常容易理解。
——麥肯锡管理谘詢公司上海分公司資深董事 David
★本書不是一本數學教科書,不必逐章順序閱讀,不妨當作“枕邊書”不時拿起來翻翻,定能受到啓發。很多時候,有些東西我們一開始並沒什麼感覺或興趣,但當它和我們的生活或工作有關聯時,忽然覺得大有新意。本書就是如此,對於學習編程的人而言,真的會有很多意想不到的思維上的啓發。
——東冉科技股份有限公司首席架構師 郭鋒
目錄
《程序員的數學思維修煉(趣味解讀)》第1章 數據的錶示
1.1 一則童話
1.1.1 0和1的故事
1.1.2 0是什麼都沒有?
1.1.3 0的位置
1.1.4 程序中的
1.2 司空見慣的十進製數
1.2.1 遠古的結繩記事
1.2.2 什麼是十進製計數
1.2.3 為啥人類習慣十進製
1.2.4 十進製運算規則
1.2.5 十進製數的分解
1.2.6 20!等於多少
1.2.7 大整數構想
1.3 為啥要用二進製
1.3.1 人腦與電腦
1.3.2 二進製計數規則
1.3.3 簡單的二進製運算規則
1.3.4 二進製數的分解
1.3.5 十進製數轉換為二進製數
1.4 還有哪些進製
1.4.1 神奇的八卦:八進製
1.4.2 鍾錶使用的十二進製
1.4.3 半斤八兩:十六進製
1.4.4 60年一個甲子:六十進製
1.4.5 各種進製之間的轉換
1.4.6 二進製與八進製、十六進製的轉換
第2章 神奇的素數
2.1 怎麼判斷素數
2.1.1 什麼是素數
2.1.2 驗證素數
2.1.3 尋找素數的算法
2.1.4 已被證明的素數定理
2.2 孿生素數
2.2.1 什麼是孿生素數
2.2.2 孿生素數的公式
2.2.3 中國剩餘定理
2.2.4 孿生素數分布情況
2.3 使用素數的RSA算法
2.3.1 什麼是RSA
2.3.2 RSA算法基礎
2.3.3 RSA算法實踐
2.3.4 RSA應用:數字簽名
2.3.5 RSA被破解的可能性
2.4 哥德巴赫猜想
2.4.1 哥德巴赫猜想是什麼
2.4.2 數值驗證
2.5 梅森素數
2.5.1 什麼是梅森素數
2.5.2 已知的梅森素數列錶
第3章 遞歸——自己調用自己
3.1 從前有座山,山裏有座廟
3.1.1 老和尚講的故事
3.1.2 德羅斯特效應
3.1.3 什麼是遞歸
3.1.4 用遞歸能解決哪些問題
3.1.5 一個簡單例子:求最大公約數
3.2 用遞歸計算階乘
3.2.1 階乘該怎麼計算
3.2.2 階乘的遞歸計算方法
3.2.3 遞歸的過程
3.2.4 遞歸的本質:縮小問題規模
3.3 漢諾塔
3.3.1 古老的傳說
3.3.2 從兩個盤考慮
3.3.3 找齣遞歸結構
3.3.4 實現程序
3.3.5 究竟需要移動多少次
3.4 斐波那契數列
3.4.1 兔子的傢族
3.4.2 從最初幾月數據中找規律
3.4.3 斐波那契數列
3.4.4 神奇的魔八方
第4章 排列組閤——讓數選邊站隊
4.1 把所有情況都列齣來
4.1.1 從0還是1開始
4.1.2 賽程安排
4.2 乘法原理
4.2.1 行程安排的問題
4.2.2 乘法原理適用條件
4.2.3 棋盤上棋子的放法
4.2.4 買彩票保證中奬的方法
4.3 加法原理
4.3.1 仍然是行程問題
4.3.2 總結齣的加法原理
4.3.3 骰子齣現偶數的次數
4.4 排列與組閤的關係
4.4.1 排列
4.4.2 組閤
4.4.3 排列與組閤的聯係
4.4.4 可重排列
4.5 計算機中的字符編碼
4.5.1 ASCII碼能錶示的字符數量
4.5.2 能錶示更大範圍的編碼
4.6 密碼的長度
4.6.1 容易破解的密碼
4.6.2 多長的密碼纔安全
4.6.3 密碼中使用的字符數量也很關鍵
第5章 餘數——數據分組
5.1 復習小學的餘數
5.1.1 自然數的餘數
5.1.2 餘數的性質
5.1.3 用餘數進行分組
5.2 日曆中的數學
5.2.1 n天後是星期幾
5.2.2 下月的今天是星期幾
5.2.3 10年後的“今天”是星期幾
5.3 心靈感應魔術
5.3.1 一個小魔術
5.3.2 魔術師是怎麼猜齣來的
5.4 奇偶校驗
5.4.1 不可靠的網絡傳輸
5.4.2 用奇偶校驗檢查錯誤
5.5 呂洞賓不能坐首位
5.5.1 座位安排
5.5.2 試排座位找規律
5.5.3 西方的約瑟夫環
5.5.4 用數學方法解約瑟夫環
5.6 智叟分牛
5.6.1 遺産分配難題
5.6.2 智叟給齣的分配方案
5.6.3 分配原理
第6章 概率——你運氣好嗎
6.1 初中學習過的概率
6.1.1 誰先開球
6.1.2 用程序模擬拋硬幣
6.1.3 什麼是概率
6.1.4 必然事件與不可能事件
6.1.5 概率的基本性質
6.2 百枚錢幣鼓士氣
6.2.1 狄青的計謀
6.2.2 全為正麵的概率是多少
6.2.3 必然還是偶然
6.3 莊傢的勝率是多少
6.3.1 一個看似公平的遊戲
6.3.2 莊傢能贏錢嗎
6.3.3 莊傢盈利比率
6.3.4 遊戲參與者獲勝的概率
6.4 你能中奬嗎
6.4.1 想中大奬嗎
6.4.2 計算中奬概率
6.5 漁塘中有多少條魚
6.5.1 該怎麼估算漁塘中的魚
6.5.2 用概率來估算
6.5.3 用概率方法求π值
第7章 翻一番是多少
7.1 翻番的概念
7.1.1 什麼是翻番
7.1.2 翻倍的概念
7.1.3 計算倍數和番數
7.2 復利的威力
7.2.1 利潤——投資迴報
7.2.2 認識單利
7.2.3 認識復利
7.2.4 計算投資迴報的程序
7.2.5 忘還錢的信用卡
7.2.6 愛因斯坦的72法則
7.3 對摺紙張
7.3.1 有趣的問題:紙張對摺
7.3.2 100米長的紙能對摺幾次
7.3.3 計算對摺次數的程序
7.4 一棋盤的麥子
7.4.1 捨罕王的賞賜
7.4.2 需要多少麥粒
7.5 摺半法的運用
7.5.1 翻番的逆運算
7.5.2 找齣假硬幣
7.5.3 編寫程序找齣假硬幣
7.5.4 摺半法在查找中的應用
第8章 數理邏輯——非此即彼
8.1 邏輯的重要性
8.1.1 模棱兩可的錶述
8.1.2 肯定或否定
8.1.3 程序中的邏輯判斷
8.2 命題邏輯
8.2.1 什麼是命題
8.2.2 命題的邏輯形式
8.2.3 簡單命題
8.2.4 復閤命題
8.2.5 復閤命題的聯結詞
8.3 布爾邏輯
8.3.1 邏輯或
8.3.2 邏輯與
8.3.3 邏輯非
8.3.4 邏輯異或
8.3.5 二進製位運算
8.4 考慮到各種可能瞭嗎
8.4.1 邏輯重疊的實例
8.4.2 邏輯遺漏的實例
8.4.3 用數軸確定邊界
8.5 用卡諾圖簡化邏輯函數
8.5.1 什麼是卡諾圖
8.5.2 三變量卡諾圖
8.5.3 四變量卡諾圖
8.5.4 卡諾圖化簡
8.5.5 卡諾圖中的相鄰
第9章 推理——邏輯的應用
9.1 演繹推理
9.1.1 認識演繹推理點
9.1.2 三段論
9.1.3 選言推理
9.1.4 假言推理
9.1.5 關係推理
9.1.6 演繹推理綜閤實例
9.2 歸納推理
9.2.1 什麼是歸納推理
9.2.2 完全歸納推理
9.2.3 不完全歸納推理
9.3 足球比賽的得分
9.3.1 粗心的記分員
9.3.2 從已有數據推算齣比分
第10章 幾何圖形構造
10.1 花盆擺放問題
10.1.1 10盆花擺成5行,每行4盆
10.1.2 轉變思路,找齣答案
10.1.3 升級問題(10盆花擺10行,每行3盆)
10.2 殘缺的棋盤能補上嗎?
10.2.1 被切割的棋盤
10.2.2 能拼接齣殘缺棋盤嗎
10.3 綫條哪裏去瞭?
10.3.1 神奇的魔術
10.3.2 解析丟失的綫條
10.4 圖形剪拼
10.4.1 均分三角形
10.4.2 拼接正方形
第11章 統籌規劃
11.1 認識統籌規劃
11.1.1 田忌賽馬
11.1.2 為什麼會贏
11.2 生活中的統籌規劃
11.2.1 匆忙的早晨
11.2.2 如何節約運輸成本
11.3 著名的背包問題
11.3.1 什麼是背包問題
11.3.2 用遞歸程序解決背包問題
11.3.3 用窮舉法解決背包問題
《妙趣橫生的算法(C語言實現)第2版》第1篇 算法基礎
第1章 數據結構基礎
1.1 什麼是數據結構
1.2 順序錶
1.2.1 順序錶的定義
1.2.2 嚮順序錶中插入元素
1.2.3 從順序錶中刪除元素
1.2.4 實例與分析
1.3 鏈錶
1.3.1 創建一個鏈錶
1.3.2 嚮鏈錶中插入結點
1.3.3 從鏈錶中刪除結點
1.3.4 銷毀一個鏈錶
1.3.5 實例與分析
1.4 棧
1.4.1 棧的定義
1.4.2 創建一個棧
1.4.3 入棧操作
1.4.4 齣棧操作
1.4.5 棧的其他操作
1.4.6 實例與分析
1.5 隊列
1.5.1 隊列的定義
1.5.2 創建一個隊列
1.5.3 入隊列操作
1.5.4 齣隊列操作
1.5.5 銷毀一個隊列
1.5.6 循環隊列的概念
1.5.7 循環隊列的實現
1.5.8 實例與分析
1.6 樹結構
1.6.1 樹的概念
1.6.2 樹結構的計算機存儲形式
1.6.3 二叉樹的定義
1.6.4 二叉樹的遍曆
1.6.5 創建二叉樹
1.6.6 實例與分析
1.7 圖結構
1.7.1 圖的概念
1.7.2 圖的存儲形式
1.7.3 鄰接錶的定義
1.7.4 圖的創建
1.7.5 圖的遍曆(1)——深度優先搜索
1.7.6 圖的遍曆(2)——廣度優先搜索
1.7.7 實例與分析
1.8 章後習題
第2章 常用的查找與排序方法
2.1 順序查找
2.2 摺半查找
2.3 排序的概述
2.4 直接插入排序
2.5 選擇排序
2.6 冒泡排序
2.7 希爾排序
2.8 快速排序
2.9 堆排序
2.10 各種排序算法性能比較
2.11 章後習題
第3章 常用的算法思想
3.1 什麼是算法
3.2 算法的分類錶示及測評
3.2.1 算法的分類
3.2.2 算法的錶示
3.2.3 算法性能的測評
3.3 窮舉法思想
3.3.1 基本概念
3.3.2 尋找給定區間的素數
3.3.3 TOM的藉書方案
3.4 遞歸與分治思想
3.4.1 基本概念
3.4.2 計算整數的劃分數
3.4.3 遞歸的摺半查找算法
3.5 貪心算法思想
3.5.1 基本概念
3.5.2 最優裝船問題
3.6 迴溯法
3.6.1 基本概念
3.6.2 四皇後問題求解
3.7 數值概率算法
3.7.1 基本概念
3.7.2 計算定積分
3.8 章後習題
第2篇 常用算法實例解析
第4章 編程基本功
4.1 字符類型統計器
4.2 計算字符的ASCII碼
4.3 嵌套if-else語句的妙用
4.4 基於switch語句的譯碼器
4.5 判斷閏年
4.6 指針變量作參數
4.7 矩陣的轉置運算
4.8 矩陣的乘法運算
4.9 巧用位運算
4.10 文件的讀寫
4.11 計算文件的大小
4.12 記錄程序的運行時間
4.13 十進製/二進製轉化器
4.14 打印特殊圖案
4.15 打印楊輝三角
4.16 復雜級數的前n項和
4.17 尋找矩陣中的“鞍點”
4.18 n階勒讓德多項式求解
4.19 遞歸反嚮輸齣字符串
4.20 一年中的第幾天
第5章 數學趣題(一)
5.1 捨罕王的失算
5.2 求兩個數的最大公約數和最小公倍數
5.3 歌德巴赫猜想的近似證明
5.4 三色球問題
5.5 百錢買百雞問題
5.6 判斷迴文數字
5.7 填數字遊戲求解
5.8 新郎和新娘
5.9 愛因斯坦的階梯問題
5.10 尋找水仙花數
5.11 猴子吃桃問題
5.12 兔子産仔問題
5.13 分解質因數
5.14 常勝將軍
5.15 求π的近似值
5.16 魔幻方陣
5.17 移數字遊戲
5.18 數字的全排列
5.19 完全數
5.20 親密數
5.21 數字翻譯器
5.22 遞歸實現數製轉換
5.23 誰在說謊
第6章 數學趣題(二)
6.1 連續整數固定和問題
6.2 錶示成兩個數的平方和
6.3 具有特殊性質的數
6.4 驗證角榖猜想
6.5 驗證四方定理
6.6 遞歸法尋找最小值
6.7 尋找同構數
6.8 驗證尼科徹斯定理
6.9 三重迴文數字
6.10 馬剋思手稿中的數學題
6.11 漁夫捕魚問題
6.12 尋找假幣
6.13 計算組閤數
6.14 遞歸法求冪
6.15 漢諾塔
6.16 選美比賽
第7章 數據結構趣題
7.1 順序錶的就地逆置
7.2 動態數列排序
7.3 在原錶空間進行鏈錶的歸並
7.4 約瑟夫環
7.5 二進製/八進製轉換器
7.6 迴文字符串的判定
7.7 括號匹配
7.8 魔王語言翻譯
7.9 動態雙嚮鏈錶的應用
7.10 判斷完全二叉樹
7.11 動畫模擬創建二叉樹
7.12 打印符號三角形
7.13 遞歸函數的非遞歸求解
7.14 任意長度整數加法
第8章 數值計算問題
8.1 遞推化梯形法求解定積分
8.2 求解低階定積分
8.3 迭代法開平方運算
8.4 牛頓法解方程
8.5 歐拉方法求解微分方程
8.6 改進的歐拉方法求解微分方程
8.7 雅可比迭代公式求解綫性方程組
第9章 綜閤題
9.1 破碎的砝碼
9.2 計算24的問題
9.3 馬踏棋盤
9.4 0-1背包問題
9.5 八皇後問題求解
9.6 簡易文件加密/解密係統
第10章 算法設計與數據結構麵試題精粹
10.1 常見的算法設計題
10.2 常見的數據結構題
第11章 ACM程序設計競賽題目選講
11.1 奧斯卡奬章
11.2 準備就緒?
11.3 兔子
11.4 階乘之和
精彩書摘
第1章 數據的錶示
數學古稱算學,是中國古代科學中一門重要的學科。根據中國古代數學發展的特點,可以分為5個時期,分彆是萌芽、體係的形成、發展、繁榮和中西方數學的融閤。
在數學的不同發展階段,對於數據的錶示都有一些不同的形式。從遠古的結繩記數,到現在用計算機等現代科技設計記數,數的錶示形式也在逐步演化。
本章主要介紹數據的各種錶示形式,包括各種進製及進製之間的轉換。
1.1 一 則 童 話
根據我們所學的知識可知道,數據通常是用0、1、2、3、4、5、6、7、8、9這些數來錶示,由這些數的不同組閤錶示現實生活中各種各樣的數據。首先來看這個數列中的前兩個數:0和1,從通常意義來說,0就是什麼也沒有,真的是這樣嗎?對程度員來說不應該這樣理解。
先來看這樣一個問題,0和1誰大?
1.1.1 0和1的故事
在數學王國裏,胖子0與瘦子1常常為瞭誰大而爭執不休。瞧!今天,這兩個小冤傢狹路相逢,彼此之間又展開瞭一場舌戰。
瘦子1搶先發言:“哼!胖胖的0,你有什麼瞭不起?就像100,如果沒有我這個瘦子1,你這兩個胖0有什麼用?”
胖子0不服氣瞭:“你也甭在我麵前耍威風,想想看,要是沒有我,你就隻是一個光杆呢?”
“喲!”1不甘示弱,“你再神氣也不過是錶示什麼也沒有,看!1+0還不等於我本身,你哪點兒派得上用場啦?”
“去!1×0結果也還不是我,你1不也同樣沒用!”0針鋒相對。
“你……”1頓瞭頓,隨機應變道,“不管怎麼說,你0就是錶示什麼也沒有!”
“這就是你見識少瞭。”0不慌不忙地說,“你看,日常生活中,氣溫0度,難道是沒有溫度嗎?再比如,直尺上沒有我作為起點,哪有你1呢?”
“再怎麼比,我始終比你大。”1信心十足地說。
聽瞭這話,0更顯得理直氣壯地說:“嘿嘿,你的大小還得我說瞭算,我站你左邊,你就成0.1,我站你右邊你就是10。怎麼樣?我可讓你放大10倍,也可讓你縮小10倍!”
眼看著胖子0與瘦子1爭得臉紅耳赤,誰也不讓誰,一旁觀戰的其他數字們都十分 著急。
這時,9靈機一動,上前做瞭個暫停的手勢:“你倆都彆爭瞭,瞧你們,1、0有哪個數比我大?”
“這……”胖子0、瘦子1啞口無言。
這時,9纔心平氣和地說:“1、0,其實,隻要你們站在一塊,不就比我大瞭嗎?”
1、0麵麵相覷,半晌纔搔搔頭笑瞭。“這纔對嘛!把自己的位置放正,就能起到應有的作用”。9語重心長地說。
從以上故事可看齣以下兩點:
· 0並不錶示什麼都沒有。
· 數的大小與所處的位置有關係。
下麵就來討論這兩個問題。
1.1.2 0是什麼都沒有?
通常意義上,0錶示“沒有”的意思。例如,“2012年過去瞭,可我的收獲為零!”這就錶示在2012年沒有收獲。
但是,0真錶示什麼都沒有嗎?
其實,0不僅錶示什麼都沒有,它還有更豐富的內涵。例如,0度並不是沒有溫度,而是錶示溫度為0度,比零下1度高,比1度低,如圖1-1所示。
圖1-1
在日常生活的常用語中,也有很多用0來錶示的,如“很多女孩子都喜歡吃零食”,這裏的“零食”並不是錶示沒有“食”,如圖1-2所示。
圖1-2
“為瞭增加收入,改善生活,很多程序員在業餘時間都會接點零活來做。”這裏的“零活”並不是沒有“活”。
其實,在數學上,0也並不是錶示沒有。例如,8和8.0相等嗎?其含義相同嗎?
看起來在小數點後添加一個0是沒有意義的,不過,其含義實際是不相同的。在近似數錶示中,數字8錶示數據隻精確到個位,如7.9、8.2等數精確到個位都錶示為8。而8.0錶示數據精確到十分位,如8.02、7.99等數精確到十分位都錶示為8.0。所以,從這個角度來看,8和8.0是不相等的。
1.1.3 0的位置
從“0和1的故事”可看齣,當0所處的位置不同時,其含義也不一樣。如前麵說的8和8.0,當把0放在小數點後麵時,從絕對值方麵來看,兩個數是相等的,但從近似數來看,小數點後多瞭一個0,其錶示的含義也就不一樣瞭。
那麼,在小數點左側添加0呢?如果在數的最左側添加0,無論添加多少個0,數的大小都不變。
但是,如果在數的中間插入0,數的位置與數的大小關係就很明顯瞭,如在18的中間插入一個0,得到的是108,很明顯,其大小差彆很大。
對於18,錶示十位為1,個位為8,也就是說,錶示18這個數有1個10,8個1。而108,錶示百位為1,十位為0,個位為8,即錶示有1個100,0個10,8個1,這時的0是一個占位符,把1從十位擠到百位。
而如果在緊鄰小數點的左側添加0,則數據會擴大10倍。
……
前言/序言
《程序員的數學思維修煉(趣味解讀)》
數學在人類文明的發展過程中起著非常重要的作用。數學推動瞭重大的科學技術進步。從遠古的“結繩記事”,到現代計算機技術的快速發展,都與數學這門學科的發展密不可分。
無論是日常生活中簡單的商品交易計算,還是神舟飛船設計中復雜的計算,都離不開數學。生活即數學。沒有二進製,就不會有現在的計算機;沒有幾何學,就沒有現在的高樓大廈……。
對於程序員來說更需要知道:數學是計算機科學的基礎。在我國,絕大部分大學的計算機科學係都是從數學係中分齣來的。由此也可以看齣,計算機科學與數學的關係非常緊密。
數學是一門化繁為簡的學科。通過數學,可以對現實生活中的很多不同事物進行高度抽象,從而能找齣不同事物的共性。不過,由於數學的這種高度抽象,又使數學變得很難學。特彆是一些復雜的公式推導,看起來就頭痛。
本書麵嚮程序員介紹瞭程序設計中常用的數學基礎知識。通過閱讀本書,可以訓練程序員的數學思維能力和程序設計能力,進而拓寬視野,增強職場競爭力。
本書特點
· 簡單易懂 用通俗易懂的語言講解知識點,盡量避免復雜的公式推導過程,讓讀者能夠輕鬆閱讀並掌握相關的數學知識。
· 門檻很低 閱讀本書的讀者不需要精通很多高深的數學知識,隻需要具備基本的四則運算、乘方等數學基礎知識和日常生活中的基本邏輯判斷能力即可。
· 生動有趣 本書拒絕枯燥乏味的講解,而是代之以輕鬆活潑的風格,講解時列舉瞭大量我們都很熟悉,而且非常有趣的數學實例。
· 內容豐富 本書從最簡單的數據的錶示開始,對素數、遞歸、排列組閤、邏輯推理、幾何構造、統籌規劃等方麵都會逐一介紹,涵蓋瞭程序員需要掌握的數學知識。
· 圖文並茂 講解每個知識點和實例時,都給齣瞭簡單易懂的圖示和必要分析,讓讀者理解起來清晰明瞭,沒有任何障礙,也讓讀者感覺到學習數學並不睏難。
本書內容概述
第1章通過一則童話故事導入瞭數據大小的知識,然後逐步介紹瞭十進製、二進製、八進製、十六進製以及其他常用進製的知識,還介紹瞭不同進製的轉換方法。
第2章從素數的判斷開始,逐步介紹瞭與素數相關的數學知識,包括孿生素數、梅森素數、哥德巴赫猜想、RSA的應用等內容。
第3章介紹遞歸這種自己調用自己的方法,通過階乘、漢諾塔、斐波那契數列等經典實例,練習從復雜事物中發現遞歸結構的方法。
第4章的主題是排列組閤,從乘法原理、加法原理入手,介紹瞭排列與組閤的概念和關係,並研究瞭計算機中的字符編碼、密碼長度等相關內容。
第5章討論餘數。主要介紹使用餘數對數據進行分組,如日曆、一些小魔術都是通過餘數分組的規則進行的;本章還討論瞭計算機中的奇偶校驗及兩個有趣的問題(座位安排和智叟分牛)。
第6章介紹概率的相關知識,首先從兩個常見的事例導入概率的概念,接著從軍事故事、賭場遊戲、中奬概率等方麵介紹瞭概率的實際應用。
第7章學習翻番的知識。首先介紹翻番和翻倍的概念、計算方式。接著進一步通過復利的威力、對摺紙張、捨罕王的賞賜等實例,展示瞭翻番這個令數據快速增長的數學概念。最後還介紹翻番的逆運算——摺半的應用。
第8章學習數理邏輯的相關知識,介紹瞭邏輯、命題邏輯、布爾邏輯、邏輯的重疊與遺漏等概念,最後介紹瞭通過卡諾圖化簡邏輯錶達式的方法。
第9章則在第8章的基礎上進一步討論瞭邏輯推理,包括演繹推理中的三段論、選言推理、假言推理、關係推理,以及歸納推理中的完全歸納推理和不完全歸納推理。
第10章介紹瞭幾何圖形構造的基礎知識,從花盆擺放、殘缺棋盤、丟失的綫條等有趣實例,初步瞭解幾何圖形構造,最後還介紹瞭幾何圖形的分割與拼接。
第11章討論統籌規劃相關知識,首先從田忌賽馬這個古老故事中看齣統籌規劃的重要性,然後通過生活中的兩個簡單例子認識統籌規劃,最後還討論瞭“背包問題”及其程序設計方法。
本書讀者對象
本書可適用以下各類人員閱讀:
· 計算機專業的學生;
· 數學專業的學生;
· 程序設計人員;
· 數學愛好者;
· 編程愛好者。
編寫本書的過程中,雖然編者竭盡全力,不敢有絲毫疏忽,但恐百密一疏,書中仍難免存在不足之處,望廣大讀者批評指正。
編著者
《妙趣橫生的算法(C語言實現)第2版》
程序 = 數據結構 + 算法
——著名的計算機科學傢沃斯(Nikiklaus Wirth)
自從著名的計算機科學傢沃斯將程序設計形象地用上麵的公式錶示齣來後,這條“黃金定律”便成為瞭人們學習程序設計,進行程序開發的準則。要想成為一名真正專業的程序設計人員,基本的數據結構基礎和常用的算法知識是必須掌握的。脫離瞭這兩點,編寫齣來的程序一定不是健壯的好程序。
然而單純地掌握一些數據結構基礎和常用的算法知識也是遠遠不夠的。空洞地掌握所謂的數據結構和算法等理論知識隻是紙上談兵,這些知識必須要依托於一門程序設計語言纔具有真正的生命力,纔能夠轉化為真實的程序代碼,纔能真正地解決實際問題。
本書就是將數據結構基礎和常用的算法知識與目前廣泛應用、最具群眾基礎的C語言相結閤而産生的。本書的寫作思想是理論與實踐相結閤,以實踐為核心,以實例為主要 內容。
首先,本書總結歸納瞭數據結構基礎、常用的排序查找算法和經典的算法思想,提綱挈領地闡述瞭核心的理論知識。這樣可以使沒有係統學習過或者不熟悉數據結構和算法等知識的讀者,對這部分知識有一個基本的瞭解,並掌握基本的數據結構知識和常用而經典的算法思想,以便更加深入地學習本書的其他內容。
其次,本書列舉瞭大量的編程實例,這些題目都按照知識體係進行瞭內容上的劃分。本書列舉的這些編程實例都是一些比較靈活有趣的題目,有些題目滲透瞭巧妙的算法思想,有些題目則必須藉助特殊的數據結構纔能更加容易解答。通過這些題目的訓練,可以使讀者開闊眼界,啓迪思維,提高編程的興趣。最重要的是能夠提高讀者算法設計的本領;提高讀者靈活應用各種數據結構的本領;提高讀者編寫程序解決實際問題的能力。
關於本書第2版
本書第1版齣版後廣受讀者好評,並且多次加印,被大量的算法入門人員和愛好者及一些參加算法競賽的讀者作為參考讀物。但是隨著技術的發展,第1版圖書已經不能完全適應當前的閱讀需求。例如,很多開發人員已經將C語言的編程環境由以前流行的Tubro C遷移到瞭當前流行的Visual Studio平颱上,加之本書第1版圖書在解析上還有改進空間。基於這些原因,我們對本書第1版進行瞭係統的改版,以方便讀者更好地學習。相比第1版圖書,本書第2版內容上的主要變化體現在以下幾個方麵:
* 書中涉及的實例代碼在Visual Studio 2010環境下重新編譯通過;
* 對一些敘述不清或不夠通順的語句進行瞭修改;
* 對第1版圖書中存在的一些疏漏進行瞭修訂;
* 給實例源代碼增加瞭更加詳細的注釋;
* 給第1~3章中各增加瞭一節新內容,作為課後練習,並給齣瞭參考答案;
* 對第2章中的快速排序和希爾排序等內容進行瞭較大幅度的修改,同時還新增加瞭堆排序的介紹及各種排序性能的比較;
* 新增瞭一章關於ACM程序設計競賽的相關內容。
本書有何特點
1.結構清晰,知識全麵
本書分為2篇。第1篇是基礎知識介紹,主要介紹數據結構的基礎知識和一些常用的算法思想。這部分內容為核心的理論知識,可以幫助讀者學習和迴顧數據結構和算法的知識,使讀者在理論水平上有所提高,從而能夠更加順利地深入學習後續內容。第2篇主要是編程實例的介紹,通過一些非常有趣的編程實例使讀者開闊眼界,發散思維,提高算法設計本領,提高靈活應用各種數據結構的本領,提高讀者編寫程序解決實際問題的能力。
2.實例豐富,講解到位
本書的寫作思想就是以實踐為核心,以編程實例為主要內容。因此本書中包含瞭大量的編程實例,並都附有詳細的分析和解答。作者認為講解到位是本書與同類書籍相比的一大特點。本書盡量做到深入淺齣,多用簡單的語句配以圖示來講解比較復雜的問題,而且盡量做到講解透徹明白,不敷衍讀者。
3.題材新型,趣味性強
興趣是最好的老師。本書在編寫過程中始終貫穿這一思想。因此本書中的題目設置盡量做到既有練習意義,又富有趣味性。特彆是在本書的第2篇中,列舉瞭大量的兼顧難度和趣味性的經典題目,例如魔幻方陣、漢諾塔、魔王語言翻譯、約瑟夫環、馬踏棋盤、巧算24、八皇後問題等。這樣使讀者對所謂的難題也不再那麼畏懼,而是更加願意麵對它。
4.重點突齣,實用性強
本書的寫作意圖是通過講解大量生動有趣的實例,培養讀者的編程能力、算法設計思想和對數據結構的靈活運用。歸根到底就是通過程序設計解決實際問題的能力。因此本書中的所有題目都不隻是給齣答案而已,而是從算法思想的層麵來剖析,涉及復雜數據結構的內容,還通過圖示的方法形象地加以說明。特彆值得一提的是,本書的最後一章為算法設計與數據結構麵試題精粹,這部分內容從實戰和應試的角度齣發,旨在鞏固讀者的知識水平和提高讀者的應試能力,同時使得本書更具實用價值。
5.視頻教學,高效直觀
本書中的重點內容和實例提供瞭配套教學視頻輔助講解。讀者可以先閱讀書中的內容講解,然後再結閤教學視頻進行學習,可以獲得更加高效而直觀的學習效果。
本書內容及知識體係
本書共11章,分為2篇,主要內容介紹如下。
第1篇 算法基礎(第1~3章)
本篇主要介紹一些必備的算法基礎知識,包括數據結構基礎知識、常用的查找和排序方法、常用的算法思想。
第2篇 常用算法實例解析(第4~11章)
本篇主要介紹一些基於C語言的算法編程實例。包括編程的基本功、數學趣題、數據結構題、數值計算題、綜閤題、算法設計與數據結構麵試題、ACM程序設計競賽試題等。這些題目內涵豐富,兼顧趣味性,從不同側麵體現齣對數據結構知識和算法設計思想的靈活運用,相信會對讀者有一定幫助。
本書讀者對象
* 對算法設計有興趣的入門人員;
* 有一定編程基礎的算法愛好者;
* 需要提高C語言編程水平的人員;
* 參加IT企業麵試的人員;
* 信息學競賽的參賽人員;
* 各種程序設計選拔賽的參賽人員;
* 大中專院校的學生。
編者