一道有趣的数学题分析步骤
2009-11-21 15:50
302 查看
123456789这九个按顺序排列的数,要求在它们之间插入若干个+,-,*,/ ,使其结果正好等于100如: 1*2*3*4+5+6+7*8+9=100
解析过程(进攻参考):
1-------2------3------4------5------6------7------8------9
9个数字共有8个间隙,可以置入的符号有+,-,*,/,#5个符号,分别代表加减乘除连接物种操作。
下面我们采用五进制数来进行遍历,分别求解是否等于100。
那么有多少种情况呢?
8个位置,每个位置是相对独立的,任何一个位置的选择不影响其他位置的选择。
所以共需要5^8个选择。
下面开始进行程序的设计:
我们为了便于计算,采用高精度的方法进行模拟5^8:
Char num[8]={0};
采用函数进行对num每次++,重载运算符++。
下面代码仅供参考,添加必要的逆波兰算法后即可进行判断。
解析过程(进攻参考):
1-------2------3------4------5------6------7------8------9
9个数字共有8个间隙,可以置入的符号有+,-,*,/,#5个符号,分别代表加减乘除连接物种操作。
下面我们采用五进制数来进行遍历,分别求解是否等于100。
那么有多少种情况呢?
8个位置,每个位置是相对独立的,任何一个位置的选择不影响其他位置的选择。
所以共需要5^8个选择。
下面开始进行程序的设计:
我们为了便于计算,采用高精度的方法进行模拟5^8:
Char num[8]={0};
采用函数进行对num每次++,重载运算符++。
下面代码仅供参考,添加必要的逆波兰算法后即可进行判断。
#include <iostream> #include <sstream> using namespace std; static char r[7]={' ','+','-','*','/'}; static char element[10]="123456789"; class Num_Base5 { public: int *num;//用来保存数据,长度16 0:无 1:+ 2:- 3:* 4:/ int base;//默认是10进制操作 Num_Base5(int s)//s代表是进制设置 { assert(s>0); num=new int(10); base=s; memset(num,0,sizeof(int)*10); } Num_Base5()//s代表是进制设置 { base=10; num=new int(10); memset(num,0,sizeof(int)*10); } ~Num_Base5() { delete num; } public: char replace(int i){ return r[num[i]]; } void setBase(int ba) { base=ba; } /*重载运算符 */ void operator++() { num[0]++; if(num[0]>=base) {//进位操作 int i=0; while(num[i]>=base) { num[i]-=base; i++; num[i]++; } } //cout<<num[0]<<'/t'<<num[1]<<'/t'<<num[2]<<'/t'<<num[3]<<'/t'<<num[4]<<'/t'<<endl; } }; class Elements{ public: char *fuc; Elements() { fuc=new char(20); } ~Elements() { delete fuc; } bool isSuitable(Num_Base5& t,int s,int e)const { for(int i=s;i<e-1;i++) { if(t.num[i]==0&&t.num[i+1]==0)return false; } return true; } //根据中间符号,组成运算多项式,存入fuc[]中 public: void toFuction(Num_Base5& t)const{ int k=0; for(int i=0;i<17;i++){ if((i&0x01)==0x00)//偶数 { fuc[k++]=element[i>>1]; } else if(t.num[i>>1])//不为0 { fuc[k++]=t.replace(i>>1);//填入符号 } } fuc[k]='/0'; cout<<fuc<<endl; } }; int main() { Num_Base5 d; d.setBase(5); Elements e; while(d.num[5]<1) { ++d; if(e.isSuitable(d,0,4)) { e.toFuction(d); } } //delete d;//free the mem cout<<"Over"<<endl; return 1; }
相关文章推荐
- 一道有趣的数学题
- 一道有趣的数学题
- 一道算法题的数学分析
- 一道有趣的数学题
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
- 家里蹲大学数学杂志第7卷第481期一道实分析题目参考解答
- 一道有趣的数学题
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
- 一道有趣的Hash加数学思想
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)(转载)
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
- 一道小时候想不明白的数学题的分析
- 一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串
- 一道有趣的sql题
- 华东师范大学2017年数学分析考研试题
- 砝码分盐问题——从数学和计算机的角度分析(11)
- 有趣的"一道引起全美大学生举国辩论的逻辑题"
- 中国科学院大学2013年数学分析高等代数考研试题