算24点 解题报告

Code:
  1. /*********************利用回溯法**********************/
  2. #include<iostream>
  3. #include<string>//字符串的头文件
  4. #include<cmath>
  5. usingnamespacestd;
  6. constdoublePRECISION(1E-6);//判断是否相等
  7. constintCOUNT_OF_NUMBER(4);
  8. constintCAL_TWENTY_FOUR(24);
  9. doublenumber[COUNT_OF_NUMBER];//存放数据
  10. stringexpression[COUNT_OF_NUMBER];//用来存放表达式
  11. boolSearch(intn)
  12. {
  13. intstate=0;//标记是否有符合条件的表达式
  14. if(n==1)
  15. {
  16. if(fabs(number[0]-CAL_TWENTY_FOUR)<PRECISION)
  17. {
  18. cout<<expression[0]<<endl;
  19. returntrue;
  20. }
  21. else
  22. {
  23. returnfalse;
  24. }
  25. }
  26. for(inti=0;i<n;i++)
  27. {
  28. for(intj=i+1;j<n;j++)
  29. {
  30. doublea,b;
  31. stringexpa,expb;
  32. a=number[i];
  33. b=number[j];
  34. number[j]=number[n-1];
  35. expa=expression[i];
  36. expb=expression[j];
  37. expression[j]=expression[n-1];
  38. expression[i]='('+expa+'+'+expb+')';//加法处理
  39. number[i]=a+b;
  40. if(Search(n-1))
  41. state=1;
  42. expression[i]='('+expa+'-'+expb+')';//减法处理
  43. number[i]=a-b;
  44. if(Search(n-1))
  45. state=1;
  46. expression[i]='('+expb+'-'+expa+')';//减法处理
  47. number[i]=b-a;
  48. if(Search(n-1))
  49. state=1;
  50. expression[i]=expa+'*'+expb;//乘法处理
  51. number[i]=a*b;
  52. if(Search(n-1))
  53. state=1;
  54. if(b!=0)
  55. {
  56. expression[i]=expa+'/'+expb;//除法处理
  57. number[i]=a/b;
  58. if(Search(n-1))
  59. state=1;
  60. }
  61. if(a!=0)
  62. {
  63. expression[i]=expb+'/'+expa;//除法处理
  64. number[i]=b/a;
  65. if(Search(n-1))
  66. state=1;
  67. }
  68. //数据的赋值
  69. number[i]=a;
  70. number[j]=b;
  71. expression[i]=expa;
  72. expression[j]=expb;
  73. }
  74. }
  75. if(state==1)
  76. returntrue;
  77. else
  78. returnfalse;
  79. }
  80. intmain()
  81. {
  82. for(inti=0;i<COUNT_OF_NUMBER;i++)
  83. {
  84. charbuffer[20];
  85. intx;
  86. cin>>x;
  87. number[i]=x;
  88. itoa(x,buffer,10);//按十进制将数字转化成字符串
  89. expression[i]=buffer;
  90. }
  91. if(!Search(COUNT_OF_NUMBER))
  92. cout<<"Fail."<<endl;
  93. return0;
  94. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值