从蓝桥凑算式得到的全排列新发现

本文介绍了一种使用next_permutation函数解决数学问题的方法,并通过一个具体的算式问题展示了如何利用此函数来寻找所有可能的解决方案。
凑算式

     B      DEF
A + --- + ------- = 10
     C      GHI
     
(如果显示有问题,可以参见【图1.jpg】)
    
    
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int main()
{
    double a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int res = 0;
    do
    {
        if( a[0] + a[1]/a[2] + (a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10.0)
        {
        	 res++;
        	 printf("%.lf+%.lf/%.lf+%.lf%.lf%.lf/%.lf%.lf%.lf\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
		}
           
    }while( next_permutation(a, a+9));
    printf("%d\n", res);
    return 0;
}

在上述程序中出现了一个函数,next_permutation(int *,int *);

这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>
与之完全相反的函数还有prev_permutation

在STL中,除了next_permutation外,还有一个函数prev_permutation,两者都是用来计算排列组合的函数。

前者是求出下一个排列组合,而后者是求出上一个排列组合

 函数原型:
  template<class BidirectionalIterator>
  bool next_permutation(
  BidirectionalIterator _First,
  BidirectionalIterator _Last
  );
  
  template<class BidirectionalIterator, classBinaryPredicate>
  bool next_permutation(
  BidirectionalIterator _First,
  BidirectionalIterator _Last,
  BinaryPredicate _Comp
  );


  两个重载函数,第二个带谓词参数_Comp,其中只带两个参数的版本,默认谓词函数为"小于"。
  返回值:bool类型(当前数列是全排列最后一个时,返回false)
  
  例子1(int型):
  int main(){
  int a[] = {3,1,2};
  do{
  cout << a[0] << " "<< a[1] << " " << a[2] << endl;
  }while (next_permutation(a, a+3));
  return 0;
  }
  输出:312/321  因为原数列不是从最小字典排列开始。
  
  所以要想得到所有全排列
  int a[] = {3,1,2}; 然后先排序为:a[] = {1,2,3};
  
  例子2(string型)
  int main(){
  string str;
  cin >> str;
  sort(str.begin(), str.end());
  do{
  cout << str << endl;
  }while (next_permutation(str.begin(),str.end()));
  return 0;
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值