您的位置:首页 > 其它

一道有趣的数学题分析步骤

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每次++,重载运算符++。
下面代码仅供参考,添加必要的逆波兰算法后即可进行判断。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: