人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
19410 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
开篇词 (1讲)
人人都能学会的编程入门课
15
15
1.0x
00:00/00:00
登录|注册

13 | 程序设计原则:把计算过程交给计算机

你好,我是胡光,欢迎回来。
上一节中,咱们说了数学思维对于编程的重要性,并且跟你介绍了一种最重要的程序设计思维:数学归纳法。这个思维,不仅可以帮助我们设计程序,而且还可以帮助我们理解及证明程序的正确性。
不过说了这些数学对编程的重要性,可能你还觉得不过瘾,感觉只是停留在理论层面,还是有一层窗户纸没有捅破。今天呢,我就给你带来一道具体的编程问题,从这个具体的问题中,让你过把瘾。

一道简单的数学题

首先,我们先看一道很简单的数学问题,求出 1000 以内所有 3 或 5 倍数的数字的和。什么意思呢?我们先缩小范围,就是求 10 以内,所有 3 或 5 的倍数。我们很快就能找到,这里有 3、5、6、9 ,它们相加之和是 23。注意,这里说的是 10 以内,所以不包括 10。
回到 1000 以内这个原问题,这个问题其实很简单,可能你现在就想马上撸起袖子开始写代码了。可别急,听我给你分析分析怎么做,才算是又好又快地用程序,解决这个实际的数学问题。

1. 把计算过程,交给计算机

一个简单的疑问,我们为什么要写程序,让计算机帮我们算这个问题呢?那是因为,计算机的计算速度,比我们人类要快上几百几千倍不止,出错率也比我们要低得多。我们写程序的一个目的,就是减少我们人类在解决问题中的具体计算过程,那什么叫做具体计算过程呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

数学思维在编程中的重要性是本文的核心主题。作者通过一个具体的编程问题,引导读者思考如何用程序解决数学问题,并强调了将计算过程交给计算机的重要性。文章展示了一个C语言程序,通过循环遍历和条件表达式来实现求解1000以内所有3或5的倍数的和的问题。作者强调了程序设计的目的是减少人类在解决问题中的具体计算过程,而将计算过程交给计算机。文章突出了程序设计原则的重要性,以及如何将数学思维与编程相结合,为读者提供了有益的技术指导。同时,文章还提到了算法思维的重要性,以及如何通过算法思维来提高程序的效率。通过具体的编程示例和数学思维的引导,读者可以更好地理解程序设计原则和算法思维的重要性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《人人都能学会的编程入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 栾~龟虽寿!
    老师说的,递归不能算,一种算法,领教了,这次课,提现了,算法的基础是数学,我说一句,算法和数学都是前人的智慧结晶。

    作者回复: ^_^

    2020-02-14
    2
  • 宋不肥
    #include<stdio.h> int main(){ int i; printf("Please input a number\n"); scanf("%d",&i); int squareofsum = (i*(i+1)/2)*(i*(i+1)/2); int sumofsquare = (1 + i) * (1 + i) * i / 4 + i * (i * i - 1) / 12; int result = squareofsum - sumofsquare; printf("the result of the difference between sumofsquare and squareofsum is %d",result); } 本科学数学的,保到了计算机读研,公式推导什么的都还行,发现代码能力和计算机底层的一些知识都很弱,对照了其他同学的答案,发现最近没有把计算封装成一个函数,也没有考虑差不为1的情况,写出来的东西很难复用,好想开学之前快点提高自己的代码能力啊

    作者回复: d(^_^o),成长是一个过程,找到自己的节奏,不懈怠,不匆忙。坚持,加油!

    2020-02-18
    2
    1
  • 不便明言
    #include<stdio.h> int main() { int n, Sum_squares, squares_Sum, balance; printf("请输入一个序列最大的数字:\n"); scanf("%d", &n); n -= 1; Sum_squares =(n* (n + 1) / 2)* (n * (n + 1) / 2); squares_Sum = n * (n + 1) * (2 * n + 1) / 6; balance = Sum_squares - squares_Sum; printf("%d以内和的平方是%d,平方和是%d,差为%d\n", n+1, Sum_squares, squares_Sum, balance); system("pause"); }

    作者回复: 完全正确

    2020-02-16
    4
    1
  • 罗耀龙@坐忘
    茶艺师学编程 /*编写程序,计算 100 以内自然数“和的平方”与“平方和”的差 以及等差数列的平方和公式 */ #include <stdio.h> int main(){ int sum2 = 0; int sum1 = (((1 + 99) * 99) / 2) * (((1 + 99) * 99) / 2);//和的平方 for(int i = 0; i < 100; i++){//平方和 sum2 += i * i; } printf("%d\n", sum1 - sum2); int a1, d, n; scanf("%d %d %d", &a1, &d, &n); int sum3 = n*a1*a1+n*d*(n-1)+n*(n-1)*(2*n-1)*d*d/6;//等差数列的平方和公式 printf("使用循环方法计算的平方和:%d\n使用平方和公式算出的结果:%d", sum2, sum3); return 0; }

    作者回复: d(^_^o)

    2020-06-21
  • 信念
    https://github.com/spiritfaith/Hello-Git/blob/master/think_everyone13.c

    作者回复: 代码中的 sum1计算,可以分成两步,会减少编码错误的概率。第一步 sum1 计算得到1--100的和值,第二步,计算 sum1的平方。

    2020-06-01
    2
  • 信念
    int sum3 = (3 + 999 / 3 * 3) * (999 / 3) / 2; 999 / 3 * 3 这个用的应该是等比数列的通项公式求的第n项

    作者回复: 不是的~~你再好好想想,这是等差数列的项数。等比数列的增长吓死人的:3 9 27 81 ....

    2020-06-01
  • Neo_Zhang
    实现 ```c #include<stdio.h> int hepingfang(int n) { return (1 + n) * (1 + n) * n / 4 + n * (n * n - 1) / 12; } int pingfanghe(int n) { return (1 + n) * (1 + n) * n / 4 + n * (n * n - 1) / 12; } int main() { //计算 100 以内自然数“和的平方”与“平方和”的差 int n; scanf("%d",&n); printf("%d - %d = %d\n",hepingfang(n),pingfanghe(n),hepingfang(n)-pingfanghe(n)); } ```

    作者回复: 非常不错,还做了相关的函数封装!赞!

    2020-05-24
  • Noya
    #include <iostream> using namespace std; typedef long long ll; int n; ll sum_pow, pow_sum = 1; int main(void) { scanf("%d", &n); sum_pow = ((1 + n) * n / 2) * ((1 + n) * n / 2); //发现之间是一个等差数列 //1+(1+3)+(1+3+5)+....+(1+3+5+.....an) int start = 1; int d = 2; int x = 1; int cur = start; for (int i = 2; i <= n; i++) // x 1+x+2 1+x+2+(x+2+2) 1+x+2+(1+2+2)+(1+2+2+2) { x += d; cur += x; pow_sum += cur; } printf("%lld\n", sum_pow - pow_sum); return 0; }

    作者回复: 哈哈哈哈,你这种发现很不错,也挺新颖的。赞一个

    2020-05-19
  • 1043
    计算机的计算都是天然的能力,1、把1-100都转换二进制然后按位与运算,之后把这个数平方再转回十进制;2、把1-100转换二进制再把每个转换后的二进制平方,得到结果再按位与运算,算完再转回十进制,这不也是平方和吗?不知道计算机这样操作数不算用递归替换数学公式计算呢?是不是把过程按计算机自己的语言操作会变的更简单呢?

    作者回复: 为啥要转成二进制算啊?没看懂你的意思,整形变量里面存储的值,就是二进制啊,你在程序中计算的时候,本质上就是二进制在计算啊。只有你在用%d输出的时候,计算机才会用十进制给你展示出来。记住,进制不影响计算结果。进制也不重要。重要的是相关数字代表的数字量。2个翻一倍,就是4个,在任何进制下,都是4个,只是表示形式不同。

    2020-04-09
    2
  • 潮汐
    int n; scanf("%d", &n); int sumOfSquares = n*(2*n+1)*(n+1)/6; int squareOfSum = ((1+n)*n/2) * ((1+n)*n/2); int res = squareOfSum - sumOfSquares; printf("和平方:%d - 平方和:%d = %d\n", squareOfSum, sumOfSquares, res); 这里想问等差数列如果差不等于1,平方和的公式又是什么呢? 网上查的一个说法是:na1²+n(n-1)d+n(n-1)(2n-1)d²,但这个公式套1就不成立!

    作者回复: 可以参考后面习题答疑文章中,我给出的通项公式的推导过程,推导公差为 d 时候的情况。

    2020-03-10
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部