急,1到9,位置固定,插入加减乘除或两个合并,求等于100的解的个数

sorrowsword 2009-10-14 04:25:24
1到9,位置固定,插入加减乘除或两个数合并(eg:1,2 -> 12),求最后等于100的解的个数,最好把构造出的式子也输出
eg:
enter:1 2 3 4 5 6 7 8 9
show: 12/3/4+5*6+78-9 = 100
...........
........
total: ** answers
...全文
584 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiyangdn 2009-10-15
  • 打赏
  • 举报
回复
没仔细看不知道对不对,改一改应该就差不多了
feiyangdn 2009-10-15
  • 打赏
  • 举报
回复
int cout100()
{
//op: 0表示加,1表示减,2表示乘,3表示除,4表示连接
//优先顺序分三个级别为op/2
int n = (int)pow(5,8);
int seq = 0;
double c[4];
int op[4];

int i = 0, j = 0, k = 0;
int mop, mi = 0;
int count = 0;
for (i=0; i<n; i++)
{
if (i == 141969)
{
i = 141969;
}
seq = i;
for (k=0;k<3;k++)
{
c[k] = k+1;
op[k] = seq%5;
seq /= 5;
}
for (j=4;j<=11;j++)//为了方便得出和,取到11
{

mop = op[0];
mi = 0;
for (k=1;k<3;k++)
{
if (mop/2 < op[k]/2)
{
mop = op[k];
mi = k;
}
else
{
break;
}
}
c[3] = j;
switch(mop)
{
case 0:
c[mi] += c[mi+1];
break;
case 1:
c[mi] -= c[mi+1];
break;
case 2:
c[mi] *= c[mi+1];
break;
case 3:
c[mi] /= c[mi+1];
break;
case 4:
c[mi] = c[mi]*10 + c[mi+1];
break;
}
for (k=mi;k<2;k++)
{
op[k] = op[k+1];
c[k+1] = c[k+2];
}
op[2] = seq%5;
seq = seq/5;
}
if (c[0] == 100)
{
count++;
}
}
return count;
}


共101个

1354 12+34+5*6+7+8+9
2545 1+23-4+56+7+8+9
3068 1/2/3*456+7+8+9
6352 1*2+34+5+6*7+8+9
6479 12+34-5+6*7+8+9
6756 1-2-3+45+6*7+8+9
12510 1+2*3+4+5+67+8+9
12529 12+3-4+5+67+8+9
12551 1-2+3*4+5+67+8+9
12756 1-2-3+4*5+67+8+9
12789 12*3-4*5+67+8+9
16320 1+23*4+5-6+7-8+9
18227 1*2+34+56+7-8+9
27800 1+2+3*4*56/7-8+9
28147 1*23+4+5+67-8+9
28350 1+2+34-5+67-8+9
31304 12+3*4+5+6+7*8+9
31312 1*2*3*4+5+6+7*8+9
31509 12-3+4*5+6+7*8+9
31977 1*2+34+5-6+7*8+9
32104 12+34-5-6+7*8+9
32381 1-2-3+45-6+7*8+9
32534 12-3-4+5*6+7*8+9
43147 1*23+4+56/7*8+9
58947 1*23*4-56/7/8+9
62525 1+2+3-4+5+6+78+9
62537 1*2*3-4+5+6+78+9
63177 1*2+3*4+5-6+78+9
63304 12+3*4-5-6+78+9
63312 1*2*3*4-5-6+78+9
63382 1*2-3+4*5-6+78+9
64675 1+2+3*4*5/6+78+9
65235 1+2*34-56+78+9
73495 1+234*5*6/78+9
78320 1+23*4-5+6+7+8-9
82049 123-4-5-6-7+8-9
84676 1-2+3*4*5+6*7+8-9
85274 123+4*5-6*7+8-9
90070 1+23*4+56/7+8-9
91774 123+45-67+8-9
98394 12/3+4*5*6-7-8-9
99487 1*2*34+56-7-8-9
106752 1*2+3+45+67-8-9
109876 1-2+3+45+6+7*8-9
110301 1-2+3*4*5-6+7*8-9
132769 12/3+4*5*6*7/8-9
140670 1+23-4+5+6+78-9
140877 1*2+3+4*5+6+78-9
141289 12*3-4+5-6+78-9
141902 1*2+3-4+5*6+78-9
141969 12/3/4+5*6+78-9
156250 1+2+3+4+5+6+7+8*9
156262 1*2*3+4+5+6+7+8*9
156420 1+23-4-5+6+7+8*9
156511 1-2*3+4*5+6+7+8*9
157039 12*3-4-5-6+7+8*9
157135 1+2*3+4*5-6+7+8*9
157536 1-2*3-4+5*6+7+8*9
157555 1+2-3*4+5*6+7+8*9
158435 1+2*3*4*5/6+7+8*9
158856 1-2-34+56+7+8*9
159088 1/2*3/4*56+7+8*9
159429 12+3*4+5+6-7+8*9
159437 1*2*3*4+5+6-7+8*9
159634 12-3+4*5+6-7+8*9
160102 1*2+34+5-6-7+8*9
160229 12+34-5-6-7+8*9
160506 1-2-3+45-6-7+8*9
160659 12-3-4+5*6-7+8*9
162661 1-2*3-4-5+6*7+8*9
162680 1+2-3*4-5+6*7+8*9
162775 1+2+3-4*5+6*7+8*9
162787 1*2*3-4*5+6*7+8*9
168170 1+23-4+56/7+8*9
168352 1*2+34-56/7+8*9
168381 1-2-3+4*56/7+8*9
169275 1+2+3-45+67+8*9
169287 1*2*3-45+67+8*9
175350 1+2+34*5+6-7-8*9
177745 1+234-56-7-8*9
185122 1*234+5-67-8*9
312632 1*2-3+4-5+6+7+89
312660 1+2*3-4-5+6+7+89
312771 1-23+4*5+6+7+89
313159 12-3-4+5-6+7+89
313300 1+2+3*4-5-6+7+89
313796 1-23-4+5*6+7+89
314642 1*2/3+4*5/6+7+89
315863 1/2*34-5+6-7+89
316254 12+3+4+5-6-7+89
316297 1*23-4+5-6-7+89
316519 12/3+4*5-6-7+89
318921 1-23-4-5+6*7+89
324382 1*2-3+4+56/7+89
324410 1+2*3-4+56/7+89
324504 12+3+4-56/7+89
324547 1*23-4-56/7+89
326174 123-45-67+89
333495 1+234*5/6-7-89
334929 12+3*45+6*7-89
340774 123+4-5+67-89

要输出,请加入以下代码:
seq = i;
printf("%d 1", i);
for (int j=2;j<=9;j++)
{
switch(seq%5)
{
case 0:
printf("+");
break;
case 1:
printf("-");
break;
case 2:
printf("*");
break;
case 3:
printf("/");
break;
}
printf("%d",j);
seq = seq/5;
}
printf("\n");
  • 打赏
  • 举报
回复
看起来是OK的嗯
[Quote=引用 3 楼 xdxiaofeng 的回复:]
1 2 3 4 5 6 7 8 9
这9个数中,有八个位置可以用来插入其他的符号。比如+,-,*,/,还有0。
插入0表示这两个是要连在一起的。

所以我们就得到了一个大小为 17的数组。
数组中有9个元素不会改变。其余的就枚举了。

int a17[]={1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9};
void f( int level)
{
if(level == 15)
{
//按照规则计算a[17]的值是不是表示100。
return;
}

a17[level]=0;
f(level+2);

a17[level]='+';
f(level+2);

a17[level]='-';
f(level+2);

a17[level]='*';
f(level+2);

a17[level]='/';
f(level+2);
}

int main()
{
f(1);//从1开始。
return 0;
}

我的思路大概就是这样。代码即兴写的,没有调试过。
[/Quote]
hhhcj 2009-10-15
  • 打赏
  • 举报
回复
规模很小,瞬间就可以计算出来总数。
[Quote=引用 2 楼 sbwwkmyd 的回复:]
5^8,穷举吧
[/Quote]
kbwmdl 2009-10-15
  • 打赏
  • 举报
回复
穷举了,虽然效率很低很低
yangbing694383929 2009-10-15
  • 打赏
  • 举报
回复
帮顶!
threeleafzerg007 2009-10-15
  • 打赏
  • 举报
回复
穷举 貌似也是我想到的唯一的办法
帖子不能编辑 2009-10-14
  • 打赏
  • 举报
回复
1 2 3 4 5 6 7 8 9
这9个数中,有八个位置可以用来插入其他的符号。比如+,-,*,/,还有0。
插入0表示这两个是要连在一起的。

所以我们就得到了一个大小为 17的数组。
数组中有9个元素不会改变。其余的就枚举了。

int a17[]={1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9};
void f( int level)
{
if(level == 15)
{
//按照规则计算a[17]的值是不是表示100。
return;
}

a17[level]=0;
f(level+2);

a17[level]='+';
f(level+2);

a17[level]='-';
f(level+2);

a17[level]='*';
f(level+2);

a17[level]='/';
f(level+2);
}

int main()
{
f(1);//从1开始。
return 0;
}

我的思路大概就是这样。代码即兴写的,没有调试过。
showjim 2009-10-14
  • 打赏
  • 举报
回复
5^8,穷举吧
sorrowsword 2009-10-14
  • 打赏
  • 举报
回复
我自己写了一个,参考了24点的算法,不过答案不确定是不是对的
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

const double zero = 1E-6;
const int num = 9;
const int target = 100;
int count = 0;
double numb[num]; //运算数据
string expr[num]; //运算表达式
int calx[num]; //运算量的属性
string buf[400];

bool loc(string a)
{
for(int i=0;i<count;i++)
{
if(buf[i]==a)
return false;
}
return true;
}

void calculate(int n)
{
if(n==1)
if( fabs(numb[0]-target) < zero)
if(loc(expr[0]))
{
buf[count] = expr[0];
cout <<"Num-"<<++count<<":\t\t\t"<<expr[0] << endl;
return ;
}
for(int i=0;i<n-1;i++)
{
int j=i+1;
if(j<n)
{
double a = numb[i],b = numb[j];
string expra = expr[i],exprb = expr[j];
int flaga = calx[i],flagb = calx[j];
for(int t=j;t<n-1;t++)
{
calx[t] = calx[t+1];
expr[t] = expr[t+1];
numb[t] = numb[t+1];
}
if((flaga == 0) && (flagb == 0))//都是初始原子量
{
expr[i] = expra+exprb;
int len = 0;
double cur = b;
while(cur>1)
{
cur = cur /10;
len++;
}
cur = a+cur;
while(len>0)
{
cur = cur*10;
len --;
}
numb[i] = cur;
calx[i] = 0;
calculate(n-1); // 实现ab
}
if((b!=0) && (flaga != 1) && (flagb == 0))//第一运算量非+-得出,第二运算量必须是原子量,且不为0
{
expr[i] = expra+"/"+exprb;
numb[i] = a/b;
calx[i] = 2;
calculate(n-1);// 实现a/b
}
if(true)
{
//加法无要求
expr[i] = expra+"+"+exprb;
numb[i] = a+b;
calx[i] = 1;
calculate(n-1); // 实现a+b
}

if(flagb != 1)//第二运算量非+-得出
{
expr[i] = expra+"-"+exprb;
numb[i] = a-b;
calx[i] = 1;
calculate(n-1);// 实现a-b
}
if((flaga != 1) && (flagb != 1))//运算量不可以是+-得出
{
expr[i] = expra+"*"+exprb;
numb[i] = a*b;
calx[i] = 2;
calculate(n-1);// 实现a*b
}
for(int t=n-1;t>j;t--)
{
calx[t] = calx[t-1];
expr[t] = expr[t-1];
numb[t] = numb[t-1];
}
numb[i] = a;numb[j] = b;
expr[i] = expra; expr[j] = exprb;
calx[i] = flaga; calx[j] = flagb;
}
}
return ;
}

void main()
{
int n;
cout<<"请输入计算个数:\t"<<endl;
cin>>n;
cout<<"请输入"<<n<<"个数\t"<<endl;
for(int i=0,x;i<n;i++)
{
char buffer[20];
cout<<"请输入第"<<i+1<<"个数字:\t";
cin >> x;
numb[i] = x;
itoa(x, buffer, 10); //以进制表示方式将int转为string存入buffer
expr[i] = buffer;
calx[i] = 0;
}
calculate(n);
cout <<"一共 "<< count <<"个解"<< endl;
}



33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧