求24问题?

sun1889 2005-10-20 01:26:02
运用加减乘除求出结果等于24。[C语言]
...全文
208 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanghui0512 2005-10-22
  • 打赏
  • 举报
回复
有一个人家写的,自己看不大懂
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
const double PRECISION = 1E-6;
const int COUNT_OF_NUMBER = 4;
const int NUMBER_TO_CAL = 24;
double number[COUNT_OF_NUMBER];
string expression[COUNT_OF_NUMBER];
bool Search(int n)
{
if (n == 1) {
if ( fabs(number[0] - NUMBER_TO_CAL) < PRECISION ) {
cout << expression[0] << endl;
return true;
} else {
return false;
}
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
double a, b;
string expa, expb;
a = number[i];
b = number[j];
number[j] = number[n - 1];
expa = expression[i];
expb = expression[j];
expression[j] = expression[n - 1];
expression[i] = '(' + expa + '+' + expb + ')';
number[i] = a + b;
if ( Search(n - 1) ) return true;
expression[i] = '(' + expa + '-' + expb + ')';
number[i] = a - b;
if ( Search(n - 1) ) return true;
expression[i] = '(' + expb + '-' + expa + ')';
number[i] = b - a;
if ( Search(n - 1) ) return true;
expression[i] = '(' + expa + '*' + expb + ')';
number[i] = a * b;
if ( Search(n - 1) ) return true;
if (b != 0) {
expression[i] = '(' + expa + '/' + expb + ')';
number[i] = a / b;
if ( Search(n - 1) ) return true;
}
if (a != 0) {
expression[i] = '(' + expb + '/' + expa + ')';
number[i] = b / a;
if ( Search(n - 1) ) return true;
}
number[i] = a;
number[j] = b;
expression[i] = expa;
expression[j] = expb;
}
}
return false;
}
void main()
{
while(1)
{
cout<<"Input 4 Numbers:";
for (int i = 0; i < COUNT_OF_NUMBER; i++) {
char buffer[20];
int x;
cin >> x;
number[i] = x;
itoa(x, buffer, 10);
expression[i] = buffer;
}
if ( Search(COUNT_OF_NUMBER) ) {
cout << "Success." << endl;
} else {
cout << "Fail." << endl;
}
cout<<endl;
}

}
bombwang 2005-10-22
  • 打赏
  • 举报
回复
学习
appleyy 2005-10-21
  • 打赏
  • 举报
回复
完了,,我怎么向外送分啊。。。我给出的问题点数是20。

不知道怎么向外送,穷的就剩下点数了。哈哈!
-------------------------
管理
koil 2005-10-21
  • 打赏
  • 举报
回复
楼上星哥的,看不懂 解释下
qhfu 2005-10-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <cmath>

using namespace std;

const double PRECISION = 0.00001;

double number[4];
string expression[4];

bool Search(int n)
{
if (n == 1)
{
if (fabs(number[0] - 24) < PRECISION)
{
cout << expression[0] << endl;
return true;
}
else
{
return false;
}
}

for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
double a, b;
string expa, expb;

a = number[i];
b = number[j];
number[j] = number[n - 1];

expa = expression[i];
expb = expression[j];
expression[j] = expression[n - 1];

expression[i] = '(' + expa + '+' + expb + ')';
number[i] = a + b;
if (Search(n - 1)) return true;

expression[i] = '(' + expa + '-' + expb + ')';
number[i] = a - b;
if (Search(n - 1)) return true;

expression[i] = '(' + expb + '-' + expa + ')';
number[i] = b - a;
if (Search(n - 1)) return true;


expression[i] = '(' + expa + '*' + expb + ')';
number[i] = a * b;
if (Search(n - 1)) return true;

if (b != 0)
{
expression[i] = '(' + expa + '/' + expb + ')';
number[i] = a / b;
if (Search(n - 1)) return true;
}

if (a != 0)
{
expression[i] = '(' + expb + '/' + expa + ')';
number[i] = b / a;
if (Search(n - 1)) return true;
}

number[i] = a;
number[j] = b;
expression[i] = expa;
expression[j] = expb;
}
}
return false;
}

int main()
{
cout <<"Please input four numbers:" <<endl;

for (int i = 0; i < 4; i++)
{
char buffer[20];
int x;
cin >> x;
number[i] = x;
itoa(x, buffer, 10);
expression[i] = buffer;
}

if (Search(4))
{
cout << "Success." << endl;
}
else
{
cout << "Fail." << endl;
}
system("pause");
return 0;
}
sun1889 2005-10-21
  • 打赏
  • 举报
回复
完了,,我怎么向外送分啊。。。我给出的问题点数是20。

不知道怎么向外送,穷的就剩下点数了。哈哈!
yzisyz 2005-10-21
  • 打赏
  • 举报
回复
我曾经写过一个,算法也很笨。就是穷举给定的4个数字所有的表达式。然后对这些表达式求值......唯一要注意的就是要注意分数运算。速度还可以。
northwolves 2005-10-20
  • 打赏
  • 举报
回复
http://pzy.sgxf.com/ReadNews.asp?NewsID=156
chenhu_doc 2005-10-20
  • 打赏
  • 举报
回复
我们学校明天运动会,我当个体育部长,比较忙,就没有好多时间,不过我会尽快的写出来的 ! 就这样了 包涵!
sun1889 2005-10-20
  • 打赏
  • 举报
回复
TO:(小虎哥)

先把你的代码贴出来,学习一下!
chenhu_doc 2005-10-20
  • 打赏
  • 举报
回复
恩~~~~
楼主~~~~~~~~~~~~
难道不用象扑克牌中限制有四张牌么??
xiaocai0001 2005-10-20
  • 打赏
  • 举报
回复
用C++ 递归写过一个
chenhu_doc 2005-10-20
  • 打赏
  • 举报
回复
我只有很笨很笨的办法
在这里等高手

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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