这是《编程之美》的2.20题目,给出一段C#代码,要求不用电脑,理解程序并回答问题。下面是从C#代码中改写成的C++代码:

#include <iostream>#include <limits>using namespace std;int main() {     int rg[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,         20,21,22,23,24,25,26,27,28,29,30,31};     for(__int64 i =1; i < numeric_limits<__int64>::max(); i++) {         int hit = 0;         int hit1 = -1;         int hit2 = -1;         for(int j = 0; j < sizeof(rg)/sizeof(*rg) && (hit <= 2); j++) {              if((i % rg[j]) != 0) {                   hit++;                   if(hit == 1) {                       hit1 = j;                   } else if(hit == 2) {                       hit2 = j;                   } else break;              }         }         if(hit == 2 && hit1+1==hit2) {              cout << "find " << i << endl;              break;         }     }     return 0;}

理解这个程序就是从输出的地方往前追溯就可以。这个程序输出的条件是hit==2&&(hit1+1==hit2),再往前追溯看hit,hit1,hit2三个变量分别代表什么,hit表示满足i%r[j]!=0的条件的次数,hit==2表示这个条件只能被满足两次,也就是说对于一个i,在rg数组的30个数中,这个i能被其它28个数整除,而不能被其中两个数整除。而hit1表示第一个不能整除i的数的下标,hit2表示第二个不能整除i的下标,这两个下标被要求相差只有1。于是,程序所要寻找的是这样的数:这个数i不能被2-31这30个数中的两个相邻的数整除,但能被其它28个数整除。所以,这个i肯定是其它28个数的最小公倍数的整数倍。然而i不能被两个相邻的数整除,所以必然是分解质因子后要么i的质因子中不包括这两个数的质因子,要么是i的质因子的次数小于这两个数中相同质因子的次数。

那么,只需要给2-31这30个数分解质因数,找一下是否有这样的相邻的两个数,要么它们的质因子中有其它数没有的质因子,要么对于相同的一个质因子,这两个数包含这个质因子的次数高于其它所有次数。为此建立一张表如下:

由上表中可以看出,只有16、17、19、23、25、27、29、31这几个数包含次数最高的质因子。而相邻的则只有16,17。所以,这段程序所要求的数i就是,它不能被16、17整除,但能被30个数中的其它28个数整除,最小的i就是其它28个数的最小公倍数,从上表中知道,这个最小的i是:23*33*52*7*11*13*19*23*29*31,用计算器计算出这个数是:2123581660200。可以把上述程序中的for循环中的i初始化成这个数来检验。

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;}

原题目如下:

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

Forexample, 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 theprogram 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出的。从题目本身的叙述中就学到了很多东西。又知道了一个数的立方还可以这样计算。可惜数学功底差,不知道在数学上是如何推导出来的。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

编程之美 之 程序理解和时间分析 与JOJ 2042相关推荐

  1. 编程之美-程序理解和时间分析

    题目如下: 阅读以下C#代码,回答问题: using System; using System.Collections.Generic; using System.Text; namespace Fi ...

  2. 编程之美-程序理解和时间分析整理

    读上述程序并回答以下问题:

  3. 编程之美 set 17 拈游戏分析 (2)

    题目 有 N 块石头河两个玩家 A 和 B. A 先将石头分成若干堆, 然后按照 BABABA... 的顺序轮流取石块, 能将剩下的石头依次取光的玩家获胜. 每次取石头时, 每个玩家只能取一堆的 m( ...

  4. java 编程之美_《编程之美—微软技术面试心得》PDF 下载

    第1章 游戏之乐--游戏中碰到的题目 1.1 让CPU占用率曲线听你指挥 1.2 中国象棋将帅问题 1.3 一摞烙饼的排序 1.4 买书问题 1.5 快速找出故障机器 1.6 饮料供货 1.7 光影切 ...

  5. 编程之美计算0到N中包含数字1的个数

    转自:http://blog.csdn.net/hongjuntu123/article/details/8743266 有这样一个函数f(n),对于任意正整数n,它表示从 0 到 n 之间出现&qu ...

  6. 精选的一些《编程之美》相关资料

    又要到一年的招聘季了,肯定又有很多人开始啃<编程之美>了吧.这本书从开阔视野的角度来说很好,不过限于篇幅,有的问题并没有讲清楚(甚至问题叙述模棱两可.被标榜为"鼓励同面试官交流以 ...

  7. 让多核CPU占用率曲线听你指挥(Windows实现)——《编程之美》1.1学习笔记

    让多核CPU占用率曲线听你指挥--<编程之美>1.1学习笔记 Problem: 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.有以下几种情况: ...

  8. 《编程之美》 查找最大(小)的k个元素

    http://blog.csdn.net/v_july_v/article/details/6370650 http://blog.csdn.net/insistgogo/article/detail ...

  9. 编程之美 - 孟岩点评

    这是一本让人着迷的书! 从我得到样书的那一刻起,在每天的闲暇时间阅读和思索这本书中的题目就成了我的一个新习惯.虽然网络上 早就流传着不少微软面试题,坊间也不乏一些程序员面试类的图书,但是像这样集中展示 ...

最新文章

  1. 代码编辑器——sublime
  2. HTML 資訊汲取(中篇) - Default namespace 問題
  3. 推荐一位学霸的秋招经历(已收到百度、阿里、腾讯、美团、京东、拼多多的 offer)...
  4. 双非计算机考研推荐学校传菜电梯,22考研双非院校排名Top100,前3名竟然是这几所!...
  5. JS实现滚动监听以及滑动到顶部
  6. C# Task异步编程
  7. 【AI视野·今日CV 计算机视觉论文速览 第188期】Wed, 23 Dec 2020
  8. php 去除div标签,JavaScript_清除div下面的所有标签的方法,复制代码 代码如下: div id=s - phpStudy...
  9. 最全的Vista破解激活工具——成功激活并通过正版验证
  10. 南航考研计算机学院学硕分数,2019南航计算机学硕经验贴
  11. 《编程之美》买书问题及c语言代码实现
  12. QQ正式推出“超级QQ秀”布局元宇宙
  13. 高仿富途牛牛-组件化(六)-炒鸡牛逼的布局记忆功能(序列化和反序列化)
  14. pmf-automl源码分析
  15. Cobbler自动安装windows10
  16. 轻流整体调研-v 1.0
  17. DGP 论文阅读笔记
  18. 2-2 Numpy-矩阵
  19. 当前的程序自动修复(automated program repair)工具介绍
  20. 求积分方法及积分知识点-----专升本

热门文章

  1. 从零开始学习信号完整性--7-SI分析仿真
  2. 白鹭引擎拉伸高度_白鹭引擎推出LakeShore:无需编程的游戏创作工具
  3. 未来链上跨境支付、融资领域龙头 Tribal 的发展与机遇
  4. WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较
  5. html语言中kbd的含义,HTML: kbd 标签
  6. C语言例题理解(小写字母转换成大写字母,兔子生兔子问题,求100以内勾股数,整数逆序输出)
  7. 网络工程设计教程系统集成方法第3版-第1章 网络工程设计概述
  8. SQL回炉重造07_函数
  9. oracle批量清除会话,oracle快速彻底清理kill会话
  10. ddns client