JOJ的2042题目是一个程序理解题目,这个题目非常有意思,给出了下面一段C++源代码,要求计算出最后的输出结果,源代码如下:

#include<cstdio>
int main(void)
{
     int x = 987654321, c = 0, d = 1, e = 6;
     while(x--){
         c += d,
         d += e,
         e += 6;
     }
     printf("%d/n", c);
     return 0;
}

原题目如下:

We can use axioms to calculate programs just like what we do in algebras. Dijkstra is the one who advocates such constructive approach whereby a program is designed together with its correctness proof. In short, one has to start from a given postcondition Q and then look for a program that establishes Q from the precondition. Often, analyzing Q provides interesting hints to finding the program. This approach is quite different from the well known Hoare Logic.

For example, the following program is calculated by Dijkstra's approach. Unfortunately, its annotation is lost so that its function is hard to grasp. You are to help with finding the final value of the variable c. Note that the program is designed under 128-bit architecture.

代码就是上面那一段。

这个题目通过小数据计算可以看出规律:x=1, c = 1; x=2, c=8; x=3, c=27; x=4, c=64,于是可以猜测这段程序是用来计算x^3的。用计算器计算出987654321^3,提交上去就AC了。

这个题目是超级大牛SIYEE出的。但是为什么会得到这样神奇的结果?有数学推导方法吗?

有!而且是高中数学知识!这时候才知道高中数学是多么有用呵!

首先看这个程序:

int x = 987654321, c = 0, d = 1, e = 6;
     while(x--){
         c += d,
         d += e,
         e += 6;
     }

这里c,d,e充当了一个临时寄存器角色,不要被赋值语句迷惑了,其实c,d,e都是数列

首先在草稿纸上列出前几列:

x  0   1    2

c  0   1    8

d  1   7   19

e  6   12  18

然后在C语言描述中看:

(1)c的数列描述:

c(n) = 0;    n = 0

c(n) = c(n -1) + d(n - 1); n>=1

(2)d的数列描述:

d(n) = 1;    n = 0

d(n) = d(n -1) + e(n - 1); n>=1

(3)e的数列描述:

e(n) = 6(n+1)

由于e(n)已知,所以可以从这里入手:

计算d(n):

d(n) = d(n -1) + e(n - 1); n>=1

变换:

d(n) - d(n -1) = e(n - 1) = 6n

可以看出是一个等变数列,用累加法:

d(n) - d(n -1) =  6n

d(n -1) - d(n -2) =  6(n-1)

...............................

d(1) - d(0) = 6

累加:

d(n) - d(0) = 6n+6(n-1)+........+6(1) = 3n(n+1)

d(n) = 3n(n+1)+1

验算一下,没错,那么继续求c(n):

用同样方法 :

c(n) = c(n -1) + d(n - 1);

c(n) - c(n-1) = 3(n -1)n +1 = 3(n^2) -3n +1

c(n-1) - c(n-2) = 3(n -2)(n-1) +1 = 3((n-1)^2) -3(n-1) +1

.................................................

c(1) - c(0) = 3(1^2) - 3(1) +1

累加:

c(n)-c(0) = 3[n^2+(n-1)^2+.......+2^2+1^2]-3[n+(n-1)+...+2+1]+n

c(n)-c(0) = 1/2[2(n)^3+3(n)^2+n]-3/2[(n)^2+n]+n

c(n)-c(0) = (n)^3+3/2(n)^2+1/2 *(n)-3/2 *(n^2)-3/2 *n +n

c(n)-c(0) = n^3,已知 C(0) = 0

故得c(n) = n^3   n = 0,1,2.......

JOJ的2042面试题目的数学推导过程相关推荐

  1. 数字录波器的理解——如何完成这一过程的(无数学推导过程)

    数字滤波器的理解 ······· 接触数字录波器之前一定接触过模拟滤波器,这种实实在在的东西-物理上存在的,给我们的感觉灰常好.我们都接触过复域也就是(频率分析域)的拉普拉斯变换和傅里叶变换,一个单位 ...

  2. 二元逻辑回归 · 数学推导过程及代码实现完全解析

    文章目录 概述 两个重要函数 预测的基本思想 二元逻辑回归 线性模型的简单回顾 从线性回归到二元逻辑回归 参数怎么估计 梯度下降 牛顿迭代 最近修改:2021/6/17 原文<从二元逻辑回归到多 ...

  3. SVM支持向量机超详细数学推导过程

    感谢哔哩哔哩阿婆主:shuhuai008 .视频讲解:https://www.bilibili.com/video/av28186618/?p=1 SVM有三宝:间隔.对偶.核技巧(核函数) 三个不同 ...

  4. Redis进阶:布隆过滤器(Bloom Filter)及误判率数学推导

    1 缘起 有一次偶然间听到有同事在说某个项目中使用了布隆过滤器, 哎呦,我去,我竟然不知道啥是布隆过滤器, 这我哪能忍?其实,也可以忍,但是,可能有的面试官不能忍!!! 于是,查询了布隆过滤器的相关知 ...

  5. 机器学习——线性回归数学推导

    文章目录 线性回归数学推导 基础知识 线性回归的计算 利用矩阵知识对线性公式进行整合 误差项的分析 似然函数的理解 矩阵求偏导 线性回归的最终求解 实验 1 二维直线实验 2 三维平面实验 3 利用最 ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法17:XGBoost

    Python机器学习算法实现 Author:louwill Machine Learning Lab 自从陈天奇于2015年提出XGBoost以来,该模型就一直在各大数据竞赛中当作大杀器被频繁祭出.速 ...

  7. 卷积神经网络(CNN)相关知识以及数学推导

    神经网络概述 神经元模型 以上就是经典的"M-P神经元模型".在这个模型中,神经元接收来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输 ...

  8. 看懂SoftMax回归算法之代价函数求偏导的数学推导——机器学习笔记(12)

    1.学习背景 这两天学习softmax逻辑回归算法,然后卡在了其代价函数求偏导处,"百科"中说,softmax的代价函数如下: 经过求导,得到梯度公式如下: 作为一个准数学专业毕业 ...

  9. 投射投影过程数学推导

    顶点数据经过模型变换.相机变换转换到观察空间,之后渲染系统引入视椎体的概念,并通过投影变换将视椎体转换到统一设备坐标系中,方便剪裁和后续窗口映射工作. 投影变换其实就是将不同对的视锥体映射到标准设备坐 ...

最新文章

  1. 51岁雷军最后一次创业:要砸657亿造车,但小米「亏」得起吗?
  2. UITableView数据更新问题
  3. 数据库:MySQL索引总结
  4. 附近有什么?8款可以查周边的App
  5. 游戏角色坐标的保存间隔_游戏岗位看这里鸭——
  6. java 参数理解,JAVA参数传递值传递的理解。
  7. du命令和df命令的区别
  8. 刷新按钮_不能忍:用户求微软为Win10 Wi-Fi窗口添加刷新按钮
  9. Mac系统如何通过自带的工具进行磁盘修复
  10. springmvc 接收对象 滴灌摘要
  11. 网易视频大神:七个问题告诉你做游戏CG还是做影视?
  12. 王亮:游戏AI探索之旅——从alphago到moba游戏
  13. 油气井钻井风险预测与控制系统——需求分析
  14. HYSBZ 3991 寻宝游戏
  15. 服务器里全是vmx文件,ESXi 虚拟机 提示 无法打开本地虚拟机的 xxx.vmx 的本地管道的 问题解决....
  16. [置顶]定向爬虫 - Python模拟新浪微博登录
  17. 《面试技巧-招聘篇》课程笔记
  18. 苹果手机功能大全介绍_苹果手机功能大全,这些你都知道吗?
  19. 谷歌浏览器突然打不开
  20. 用于Transformer的6种注意力的数学原理和代码实现

热门文章

  1. 获取淘宝开发平台的sessionKey
  2. 03|复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
  3. (JAVA)StringBuffer类
  4. 《linux就该这么学》第六节,计划任务和用户身份管理!
  5. HDU 1159 Common Subsequence 动态规划
  6. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析
  7. sublime2使用和配置
  8. emctl start dbconsole OC4J_dbconsole*** not found
  9. codevs1040 统计单词个数
  10. UDP模式与TCP模式的区别