1 2 3 4 5 6 7 8 9 = 81 在1-9之间添加加减乘除号,使等式成立

  1 /************************************************************************/
  2 /* 1 2 3 4 5 6 7 8 9 = 81 在1-9之间添加加减乘除号,使等式成立。                                                                     */
  3 /************************************************************************/
  4 #include <iostream>
  5 using namespace std;
  6 
  7 bool stop = false;    //控制遍历终止
  8 int count_ = 0;        //计算结果数量
  9 int count_loop = 0;    //计算循环次数
 10 
 11 void trans(int* arr, int index)    //从右往左递增遍历
 12 {
 13     if(index < 0)
 14         return;
 15     int temp = arr[index] / 4;
 16     if(temp <= 0)    //判断是否需要进位
 17         return;
 18     arr[index] = arr[index] % 4;
 19     if(index == 0)    //判断是否已经遍历完
 20     {
 21         stop = true;
 22         return;
 23     }
 24     arr[index - 1] += temp;
 25     trans(arr, index - 1);
 26 }
 27 
 28 void show(int* symbol, int len)    //处理每次遍历结果,并显示正确项
 29 {
 30     float number[9]= {1,2,3,4,5,6,7,8,9};
 31     int symbol_copy[9];
 32     for(int i = 0; i < 9; ++i)
 33     {
 34         symbol_copy[i] = symbol[i];
 35     }
 36     /*
 37     计算出带乘除号的结果,将前面的项置为0,符号沿用前面的符号
 38     */
 39     for(int i = 0; i < len -1; i++)        //合并乘除项
 40     {
 41         if(symbol_copy[i] == 2 || symbol_copy[i] == 3)
 42         {
 43             if(symbol_copy[i] == 2)            //计算合并后的结果
 44             {
 45                 number[i+1] = number[i] * number[i+1];
 46             }
 47             else if(symbol_copy[i] == 3)
 48             {
 49                 number[i+1] = number[i] / number[i+1];
 50             }
 51             number[i] = 0;//合并后将前一个数置零
 52 
 53             if(i == 0)
 54                 symbol_copy[i] = 0;
 55             else
 56                 symbol_copy[i] = symbol_copy[i-1];    //乘除结果合并,符号替换成前面的符号
 57         }
 58     }
 59 
 60     float num = number[0];
 61     for(int i = 0; i < len - 1; ++i)    //计算结果
 62     {
 63         if(symbol_copy[i] == 0)
 64             num += number[i+1];
 65         else if(symbol_copy[i] == 1)
 66             num -= number[i+1];
 67     }
 68 
 69     if(num == 81)//打印正确等式
 70     {
 71         count_++;
 72         for(int i = 0; i < len -1; ++i)
 73         {
 74             cout<<i+1;
 75             if(symbol[i] == 0)
 76                 cout<<"+";
 77             else if(symbol[i] == 1)
 78                 cout<<"-";
 79             else if(symbol[i] == 2)
 80                 cout<<"*";
 81             else if(symbol[i] == 3)
 82                 cout<<"/";
 83         }
 84         cout<<"9=81"<<endl;
 85     }
 86 }
 87 
 88 
 89 int main()
 90 {
 91     int  symbol[9] = {0};// [0:+ 1:- 2:* 3:/]
 92     int len = 9;
 93     while(!stop)
 94     {
 95         show(symbol, len);
 96         symbol[len-2]++;
 97         trans(symbol, len-2);
 98         count_loop++;
 99     }
100     cout<<""<<count_<<" 种可能"<<endl;
101     cout<<"遍历了"<<count_loop<<""<<endl;
102     system("pause");
103     return 0;
104 }

转载于:https://www.cnblogs.com/felove2013/p/4390617.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值