写程序到底需不需要懂数学?

本文探讨了数学在编程中的重要性,通过实例对比了利用数学原理优化程序的方法,并强调了在面对大规模用户时,算法效率的重要性。
写程序需要数学吗?要看程序的目的?那我们就像讨论一个简单的程序,算出1加到100的总和。

完全以程序结果为导向的人,或是训练有素的程序女/男工,甚至有时连我都会很直觉的写出这样的程序:

int sum = 0;

for (int i=1; i<=100; i++)

sum += i;

上面这个程序片段还算很容易让人一眼就看懂,可是我们明明国中时就学过了这种数列级数的算法了,怎么还会写出上面这么笨的程序呢?

 int sum = ((1 + 100) * (100 - 1 + 1)) / 2;或更精简的

int sum = (101 * 100) >> 2;

这个例子已经被说烂了,我们来来看另一个例子,计算1加到10000,奇数和偶数的总和。用循环的话,一样很直觉得就写出来了:

int oddSum = 0;

int evenSum = 0;

for (int i=1; i<=10000; i++)

{

if (i % 2 == 0)

evenSum += i;

else

oddSum += i;

}很简单的程序吧!可是我们稍稍的用我们有12年(国小到高中)的数学背景想一下,你可以写出更精简的程序:

int sum = (10001 * 10000) >> 2;

int evenSum = 5001 * 5000;

int oddSum = sum - evenSum;什么?看不懂?!sum应该知道怎么算出来吧?就刚刚第一个例子是1加到100,现在改加到10000而已。evenSum呢?简单的推理一下,1到10000之间的偶数总和是是2+4+6+...+10000,把它们全部除以2的话会变成1+2+3+...+5000,所以1到10000偶数的总和不就是1加到5000的两倍吗?

1加到5000是:

(5001 * 5000) >> 2两倍就不用除那个2了,所以不就是上面那个算式了吗!

那1到10000奇数的总和不就是全部的总和减掉偶数的总合吗!稍微动一下脑袋,可以让你的程序变得很有效率。怕别人看不懂?是不会加个批注在程序代码里面喔!

相信聪明的你,很容易就可以分析出来这两个例子的两种写法,在效能上迶多大的差异,但这不是我在这里想要表答数学是如何如何增加效率的。我想要表答的是,我们明明辛苦了12年,学了一堆的数学,为什么我们要放弃这样的基本训练?我们笑美国人的数学不好,请问你又用了多少的数学来帮助你的生活和你的工作?学了又不用,那不如从小学开始就分科系好了,不喜欢数学、怕数学的,就选完全用不到数学的科系。

我今天不是要大家在写程序是时钻研那种算法、功式等,去计较那些在现在动不动在2GHZ, 3GHZ,双核心、四核心之下,所省下的那微小的效率。而是你的态度!你宁愿多打一些code,也不愿动一下脑筋,如果你的态度是这样子的话,那也是活得下去啦,不过你的水平就不过如此而已。

你会反驳说,需要用到算法、要讲求效率时,我再去研究一下就好了,干嘛说的很严重似的。今天我们一时兴起,要去爬阳明山,没问题啊,那种程度的山,只要双脚健全走得动的人都能爬。如果换成现在流行的登山步道呢?这需要一点点体力才行。如果你要去爬台湾百岳呢?合欢山的东峰算是最简单的吧?开车到山脚下,穿个好一点的鞋子、好一点的衣服、多一点的体力,也还不是太大的问题。那爬玉山呢?虽然现在爬玉山已经很方便了,连行李都可以请人帮你背,但平常没有一些训练,要爬上去不是那么容易的事。你要站在世界的最高点,去挑战圣母峰,那全世界没几个人办得到,而且办到的人事前可是经过了严格的训练。

你想把自己摆在什么位置?你想要成就到什么样的高度?如果你只想在小小的台湾,在二、三流的公司里,打打项目游击战,赚个还算可以的薪水,那的确,你不怎么需要数学,连软件工程的理论也不太需要,最重要的唬弄客户的技术纯熟就可以了。去年去了101的37楼面试后,我才知道我了不起只爬到阿里山而已,要登上MountainView这座山,我必需十倍努力才行。而这个努力不是我在面试前,看看什么教战手册、写写网络上的考古题我就能够通过的,而是必需把一些数学的训练熟到变成很自然的反应才行。简单的问你就好了啦,上面那个用循环写的1加到10000的那个例子,如果10000改用n的话,那需要多少时间,用大O(big O)来表示。如果你不能很快的推论出是O(n)的话,那你的履历连投都不要投,在37楼问的问题比这难多了,而且你没几分钟的时间可以作答。去年那次,是我第二次后悔当初没把数学学好。

为什么Google会这么重视算法和效率?应该说世界级的大公司都重视,Yahoo、微软、YouTube…,因为你写的程序不是给几十个人、几百个人用而已。而是同一时间有几百万,甚至上千万人使用。一个人慢0.1秒好了,一百万人就10万秒,超过一天耶。浏览一个网页,慢个几秒钟你都不能忍受了,更何况是一天。你说能不计较算法和效率吗?!

你想过什么样的生活是你自己决定的,但你想要当个世界级的软件工程师的话,把学数学就当作是一种修行吧!不要怕没地方用,因为你时时刻刻都可以用到它。当你的修行到了某个程度,要挑战高山,就比别人容易多了。

好好好,不想深入就算了,但你不觉得放弃12年的数学训练很可惜吗?至少花点脑筋用一下嘛~~,大家都多少用一点,软件的水平就会慢慢提升了,你说是吗? 
<think>我们正在讨论如何阅读和理解C语言程序代码。用户之前询问了关于PCBA板固件提取的问题,但当前的问题转向了代码阅读技巧。引用[1]和[2]都是爱心代码的例子,我们可以用它们作为分析实例。 目标:教用户如何阅读和理解C语言程序 方法:分步骤讲解,结合爱心代码示例 步骤: 1. 程序结构分析:头文件、主函数等 2. 逐行阅读:从main函数开始,按执行顺序理解 3. 变量和数据类型:识别变量及其作用 4. 控制结构:循环、条件语句 5. 函数调用:系统函数和自定义函数 6. 注释和文档:利用注释理解代码意图 7. 调试和运行:实际运行代码观察行为 我们将用引用[1]的爱心代码作为例子(因为它更简洁): #include <stdio.h> #include <Windows.h> int main() { system("color 04"); float x = 0.0f, y = 0.0f, a = 0.0f; for (y = 1.5f; y > -1.5f; y -= 0.1f) { for (x = -1.5f; x < 1.5f; x += 0.05f) { a = x * x + y * y - 1; if (a * a * a - x * x * y * y * y < 0) { printf("*"); } else { printf(" "); } } Sleep(150); printf("\n"); } return 0; } 注意:我们只需要在回答中自然地引用,所以当提到爱心代码时,我们可以引用[1]或[2]。 另外,根据系统指令,数学表达式要用LaTeX格式,比如爱心公式:$(x^2+y^2-1)^3 - x^2 y^3 < 0$,这里用行内公式格式。 最后,生成相关问题。</think>理解C语言程序代码需要系统的方法和技巧。以下结合爱心代码示例[^1][^2]说明具体分析步骤: ### 一、代码阅读方法论 1. **入口定位** 从`main()`函数开始,这是所有C程序的执行起点。示例中`int main()`是程序入口[^1][^2]。 2. **头文件分析** - `#include <stdio.h>`:标准输入输出(含`printf`) - `#include <Windows.h>`:提供Windows特有函数如`Sleep()`和`system()`[^2] 3. **变量声明追踪** ```c float x = 0.0f, y = 0.0f, a = 0.0f; // 定义浮点变量 ``` 变量作用: - `x, y`:坐标系中的点位置 - `a`:存储中间计算结果 4. **控制流解析** - **双重嵌套循环**: ```c for (y = 1.5f; y > -1.5f; y -= 0.1f) { // 垂直方向扫描 for (x = -1.5f; x < 1.5f; x += 0.05f) { // 水平方向扫描 ``` - 外层循环控制$y$轴(步长$-0.1$) - 内层循环控制$x$轴(步长$0.05$) 5. **核心逻辑理解** ```c a = x * x + y * y - 1; if (a * a * a - x * x * y * y * y < 0) ``` - 数学本质:判断点$(x,y)$是否在隐函数$(x^2+y^2-1)^3 - x^2y^3 < 0$定义的区域内[^2] - 满足条件输出`*`(构成爱心),否则输出空格 6. **辅助功能分析** - `system("color 04")`:设置终端背景黑/前景红[^2] - `Sleep(150)`:延迟150ms产生动画效果 - `printf("\n")`:换行实现逐行打印 ### 二、调试验证技巧 1. **逐行跟踪** ```c // 示例:跟踪某点计算过程 x = 0.0f, y = 0.0f; a = 0*0 + 0*0 - 1; // a = -1 if( (-1)^3 - 0*0*0 < 0 ) // true → 输出* ``` 2. **修改参数观察** - 将`y -= 0.1f`改为`y -= 0.2f`:爱心高度压缩 - 将`Sleep(150)`改为`Sleep(50)`:动画加速 3. **可视化辅助** ```mermaid graph TD A[main开始] --> B[设置终端颜色] B --> C[初始化坐标变量] C --> D[y循环] D --> E[x循环] E --> F[计算爱心方程] F --> G{是否在区域内?} G -->|是| H[打印*] G -->|否| I[打印空格] H & I --> J[x循环结束?] J -->|否| E J -->|是| K[延迟+换行] K --> L[y循环结束?] L -->|否| D L -->|是| M[程序结束] ``` ### 三、数学原理详解 爱心曲线由隐函数定义: $$(x^2 + y^2 - 1)^3 - x^2y^3 < 0$$ - 当点$(x,y)$满足不等式时,位于爱心内部 - 程序通过离散点扫描实现图形化(分辨率$0.05 \times 0.1$) - 边界条件:$x \in [-1.5,1.5], y \in [-1.5,1.5]$[^1] > 通过此例可掌握:控制流分析、数学建模、系统API调用、调试技巧等核心能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值