#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
const double PRECISION = 1E-6; //精度常量
const int COUNT_OF_NUMBER = 4; //算24点的自然数个数
const int NUMBER_TO_BE_CAL = 24;
void Swap(int &m,int &n)
{
int x;
x=m;
m=n;
n=x;
}
class RationalNumber //定义有理数类(分子、分母)
{
protected:
int numerator,denominator; //numerator:分子,denominator:分母
bool inf;
protected:
int gcd(int a,int b) //求a和b的最大公约数
{
if(a==0)return b;if(b==0) return a;
if(a>b) Swap(a,b);
while(a>0){
int c=b%a;b=a;a=c;
}
return b;
}
public:
RationalNumber()
{
inf=false;
}
RationalNumber(int n)
{
numerator=n;
denominator=1;
inf=false;
}
RationalNumber(int numerator,int denominator)
{
this->numerator=numerator;
this->denominator=denominator;
Simplify();
}
virtual ~RationalNumber() {}
void Simplify()
{
if(denominator==0)
{
inf=true;
}
else
if(numerator==0)
{
denominator=1;
inf=false;
}
else
{
int k=gcd(abs(numerator),abs(denominator));
numerator/=k;
denominator/=k;
inf=false;
}
}
RationalNumber operator+(const RationalNumber& b) const
{
RationalNumber result;
result.denominator=this->denominator*b.denominator;
result.numerator=this->numerator*b.denominator+this->denominator*b.numerator;
result.Simplify();
return result;
}
RationalNumber operator-(const RationalNumber& b) const
{
RationalNumber result;
result.denominator=this->denominator*b.denominator;
result.numerator=this->numerator*b.denominator-this->denominator*b.numerator;
result.Simplify();
return result;
}
RationalNumber operator*(const RationalNumber& b) const
{
RationalNumber result;
result.denominator=this->denominator*b.denominator;
result.numerator=this->numerator*b.numerator;
result.Simplify();
return result;
}
RationalNumber operator/(const RationalNumber& b) const
{
RationalNumber result;
result.denominator=this->denominator*b.numerator;
result.numerator=this->numerator*b.denominator;
result.Simplify();
return result;
}
RationalNumber& operator=(const RationalNumber& b)
{
denominator=b.denominator;
numerator=b.numerator;
return (*this);
}
RationalNumber& operator=(int b)
{
denominator=1;
numerator=b;
return (*this);
}
bool operator==(const RationalNumber& b) const
{
if((b.denominator==this->denominator)&&(b.numerator==this->numerator)) return true;
return false;
}
bool operator==(int b) const
{
if((1==this->denominator)&&(b==this->numerator)) return true;
return false;
}
bool operator!=(const RationalNumber& b) const
{ if(b.denominator!=this->denominator||b.numerator!=this->numerator) return true;
return false;
}
bool operator!=(int b) const
{
if(1!=this->denominator||b!=this->numerator) return true;
return false;
}
int Numerator() const
{ return numerator; }
int Denominator() const
{ return denominator; }
};
RationalNumber number[COUNT_OF_NUMBER]; //用数组number[]保存操作数
string expression[COUNT_OF_NUMBER]; //用数组expression[]保存算式
bool Search(int n) //递归函数
{
if (n==1)
{
if (number[0]==NUMBER_TO_BE_CAL) //成功搜索得到24
//若number[]是double型
//也可用if (fabs(number[0]-NUMBER_TO_BE_CAL)<PRECISION)
{
//expression[0].erase("(")
// int cot=3;
// while(cot--){
// string::iterator it;
// for (it =expression[0].begin(); it != expression[0].end(); ++it)
// {
// if ( *it == '(')
// {
// expression[0].erase(it);
// }
// }
// }
// int count1=3;
// while(count1--){
// string::iterator it1;
// for (it1 =expression[0].begin(); it1 != expression[0].end(); ++it1)
// {
// if ( *it1== ')')
// {
// expression[0].erase(it1);
// }
// }
// }
int num1=0,num2=0;
char strtemp[100];
strcpy(strtemp,expression[0].c_str());
for(num1=0;num1<strlen(strtemp);num1++)
{
if(strtemp[num1]!='('&&strtemp[num1]!=')')
{
strtemp[num2++]=strtemp[num1];
}
}
strtemp[num2]='\0';
cout<<strtemp<<endl;
/*cout<<expression[0]<<endl; //输出表达式*/
return true;
}
else
{
return false;
}
}
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
{
RationalNumber a, b;
string expa, expb;
a=number[i]; //用a保存number[i]
b=number[j]; //用b保存number[j]
number[j]=number[n-1]; //将number[n-1]向前填入到原来number[j]的位置
expa=expression[i]; //用expa保存expression[i]
expb=expression[j]; //用expb保存expression[j]
expression[j]=expression[n-1];
//将expression[n-1]向前填入到原来expression[j]的位置
//因为下一层递归调用search(n-1)将仅对下标为0~n-2的数进行操作了
//加法
expression[i]='('+expa+'+'+expb+')';
//将a和b计算的算式填入到原来expression[i]的位置
number[i]=a+b; //将a和b计算的结果填入到原来number[i]的位置
if (Search(n-1)) return true;
//一旦得到一个可行解,即层层向上返回,从而确保只输出一个可行解
//减法有两种情况a-b和b-a
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;
//除法也有两种情况a/b和b/a
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;
}
//本轮调用完毕后,用a,b,expa,expb将数组number[]和expression[]恢复原状
number[i]=a;
number[j]=b;
expression[i]=expa;
expression[j]=expb;
}
}
return false;
}
int main()
{
int num;
for (int i=0;i<4;i++)
{
char buffer[20]; //分配长度为20的字符数组buffer[]
char x,c;
int flag1=0;
cin>>x;
if (x=='0')
{cin>>x;
}
if (x>='2'&&x<='9')
{num=x-'0';flag1=1;
}
if (x=='1')
{num=10;flag1=1;
}
if (x=='J')
{num=11;flag1=1;
if(i==3)
{if(cin.get() != '\n')
{cout<<"ERROR";
return 0;}
}
}
if (x=='Q')
{num=12;flag1=1;
}
if (x=='K')
{num=13;flag1=1;
}
if (x=='A')
{num=1;flag1=1;
}
if(flag1==0&&x!='0')
{
cout<<"ERROR"<<endl;
return 0;
}
number[i]=num;
itoa(num,buffer,10); //itoa():将一个10进制的integer数转换为string类型
//即:把输入的int型操作数x,转变成可以放在buffer[]中的string类型
expression[i]=buffer; //用expression[i]指针指向buffer[]数组空间的起始位置
}
bool dex=Search(4);
if(!dex) cout<<"NONE"<<endl;
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
华为OJ机试题 绝对值
共388个文件
pdb:57个
dsw:29个
pch:29个
5星 · 超过95%的资源 需积分: 18 56 下载量 69 浏览量
2014-07-10
21:09:33
上传
评论
收藏 25.89MB ZIP 举报
温馨提示
vc6.0建的工程,包括基础篇的大多数的题目,绝对是很有价值的东西,欢迎大家下载
资源推荐
资源详情
资源评论
收起资源包目录
华为OJ机试题 绝对值 (388个子文件)
Script1.aps 17KB
a1.asp 2B
bitmap1.bmp 1KB
计算字符串距离.bsc 305KB
24点运算.bsc 241KB
a1.cpp 6KB
a1.cpp 5KB
a1.cpp 4KB
a1.cpp 4KB
a1.cpp 3KB
a1.cpp 2KB
a1.cpp 1KB
a1.cpp 1KB
a1.cpp 1KB
a1.cpp 1KB
a1.cpp 1KB
a1.cpp 1KB
a1.cpp 1KB
a1.cpp 917B
a1.cpp 907B
a1.cpp 850B
a1.cpp 782B
a1.cpp 738B
a1.cpp 679B
a1.cpp 556B
a1.cpp 544B
a1.cpp 532B
a1.cpp 527B
a1.cpp 521B
a1.cpp 475B
a1.cpp 443B
a1.cpp 340B
a1.cpp 295B
a1.cpp 268B
cursor1.cur 326B
a1.cur 326B
cursor1.cur 326B
识别有效的IP地址和掩码并进行分类统计.dsp 5KB
找出字符串中第一个只出现一次的字符.dsp 4KB
判断两台计算机IP地址是同一子网络.dsp 4KB
删除字符串中出现次数最少的字符.dsp 4KB
计算日期到天数转换.dsp 4KB
IP地址与整数转换.dsp 4KB
计算字符串距离.dsp 4KB
高精度整数加法.dsp 4KB
字符串合并处理.dsp 4KB
超长正整数相加.dsp 4KB
查找兄弟单词.dsp 4KB
找出等差数列.dsp 4KB
计算整数位数.dsp 4KB
简单密码破解.dsp 4KB
百千买百鸡.dsp 4KB
扑克牌大小.dsp 4KB
字符串加密.dsp 4KB
上楼梯问题.dsp 4KB
字符串排序.dsp 4KB
字符串分割.dsp 4KB
24点运算.dsp 4KB
冒泡排序.dsp 4KB
句子逆序.dsp 4KB
插入排序.dsp 4KB
记负均正.dsp 4KB
进制转换.dsp 4KB
称砝码.dsp 4KB
汽水瓶.dsp 4KB
自守数.dsp 4KB
识别有效的IP地址和掩码并进行分类统计.dsw 597B
找出字符串中第一个只出现一次的字符.dsw 593B
判断两台计算机IP地址是同一子网络.dsw 589B
删除字符串中出现次数最少的字符.dsw 585B
计算日期到天数转换.dsw 561B
IP地址与整数转换.dsw 557B
高精度整数加法.dsw 553B
字符串合并处理.dsw 553B
超长正整数相加.dsw 553B
计算字符串距离.dsw 553B
查找兄弟单词.dsw 549B
找出等差数列.dsw 549B
计算整数位数.dsw 549B
简单密码破解.dsw 549B
百千买百鸡.dsw 545B
扑克牌大小.dsw 545B
字符串加密.dsw 545B
上楼梯问题.dsw 545B
字符串排序.dsw 545B
字符串分割.dsw 545B
冒泡排序.dsw 541B
句子逆序.dsw 541B
插入排序.dsw 541B
记负均正.dsw 541B
24点运算.dsw 541B
进制转换.dsw 541B
称砝码.dsw 537B
汽水瓶.dsw 537B
自守数.dsw 537B
识别有效的IP地址和掩码并进行分类统计.exe 572KB
计算整数位数.exe 572KB
IP地址与整数转换.exe 544KB
称砝码.exe 544KB
判断两台计算机IP地址是同一子网络.exe 536KB
共 388 条
- 1
- 2
- 3
- 4
vicdwaaa
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页