用C++解越南小学三年级数学题
2015-05-31 12:55
316 查看
据悉题目来自越南保禄小学三年班,学生需要由上至下、从左到右的顺序,填入1至9的数字,可重复填写,并按先乘除后加减的运算法则,完成整条算式。
河内一家人才培育中心的副总监陈方表示,题目只需用到基本运算技巧,他邀请一些成年人挑战,包括拥有经济学博士学位的人,不过全部人都答不出来。
人力很难办到的事情,用计算机来解决就简单多了。我们使用C++程序设计语言,采用穷举法来计算这道题目。穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。
在原题所列空框内,依次填列a, b, c, d, e, f, g, h, i的未知数,如下图所示:
根据上图列式可得:a+13*b/c+d+12*e-f-11+g*h/i-10 = 66
进一步化简上式得:a+13*b/c+d+12*e-f+g*h/i = 87
已知a, b, c, d, e, f, g, h, i的取值区间为[1,9],所以穷举计算有9*9*9*9*9*9*9*9*9=9^9=387420489种判定,我们要从总判定数中筛选出符合等式成立的结果。由未知数个数可确定循环为9层。每层从1递增至9,步长为1。这样我们可以很容易写出源码。
在Windows 7 64位简体中文专业版和C++ Builder 2010集成开发环境下的控制台程序源码:
程序运行部分结果如下图:
河内一家人才培育中心的副总监陈方表示,题目只需用到基本运算技巧,他邀请一些成年人挑战,包括拥有经济学博士学位的人,不过全部人都答不出来。
人力很难办到的事情,用计算机来解决就简单多了。我们使用C++程序设计语言,采用穷举法来计算这道题目。穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。
在原题所列空框内,依次填列a, b, c, d, e, f, g, h, i的未知数,如下图所示:
根据上图列式可得:a+13*b/c+d+12*e-f-11+g*h/i-10 = 66
进一步化简上式得:a+13*b/c+d+12*e-f+g*h/i = 87
已知a, b, c, d, e, f, g, h, i的取值区间为[1,9],所以穷举计算有9*9*9*9*9*9*9*9*9=9^9=387420489种判定,我们要从总判定数中筛选出符合等式成立的结果。由未知数个数可确定循环为9层。每层从1递增至9,步长为1。这样我们可以很容易写出源码。
在Windows 7 64位简体中文专业版和C++ Builder 2010集成开发环境下的控制台程序源码:
//--------------------------------------------------------------------------- #pragma hdrstop #include <tchar.h> #include <iostream> using namespace std; //--------------------------------------------------------------------------- #pragma argsused int _tmain(int argc, _TCHAR* argv[]) { int a, b, c, d, e, f, g, h, i; //设置9个未知数 long int counter = 0; //计数器 long int line = 0; const int MY_MAX = 10; //1-9范围内的数字 for(a = 1; a < MY_MAX; a++) for(b = 1; b < MY_MAX; b++) for(c = 1; c < MY_MAX; c++) for(d = 1; d < MY_MAX; d++) for(e = 1; e < MY_MAX; e++) for(f = 1; f < MY_MAX; f++) for(g = 1; g < MY_MAX; g++) for(h = 1; h < MY_MAX; h++) for(i = 1; i < MY_MAX; i++) { line++; // a+13*b/c+d+12*e-f-11+g*h/i-10 == 66.0 if ((13*b%c == 0) && (g*h%i == 0) && (a+13*b/c+d+12*e-f+g*h/i == 87)) //计算方程式的值,判断是否是一组解 { cout << "[" << ++counter << "]\t"; cout << "a=" << a << "; "; cout << "b=" << b << "; "; cout << "c=" << c << "; "; cout << "d=" << d << "; "; cout << "e=" << e << "; "; cout << "f=" << f << "; "; cout << "g=" << g << "; "; cout << "h=" << h << "; "; cout << "i=" << i << ";\n"; } } cout << "line = " << line << endl; system("PAUSE"); return 0; }
程序运行部分结果如下图:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++中拷贝构造函数的应用详解
- C++中引用(&)的用法与应用实例分析
- C++使用CriticalSection实现线程同步实例
- C++智能指针实例详解
- 解析C++ 浮点数的格式化输出