标题:算式900
小明的作业本上有道思考题:
看下面的算式:
(□□□□-□□□□)*□□=900
其中的小方块代表0~9的数字,这10个方块刚好包含了0~9中的所有数字。
注意:0不能作为某个数字的首位。
小明经过几天的努力,终于做出了答案!如下:
(5012-4987)*36=900
用计算机搜索后,发现还有另外一个解,本题的任务就是:请你算出这另外的一个解。
注意:提交的格式需要与示例严格一致;
括号及运算符号不要用中文输入法;
整个算式中不能包含空格。
注意:机器评卷,不要填写任何多余的内容,比如说明文字。
题目的解法:定义一个数组包含0-9这10个数字,满足(XXXX-XXXX)*XX==900,如果能够使得10个数字顺序变化轮换一遍即可解决此问题。
由此可以选择使用函数next_permutation。
两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。
首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。
考虑三个字符所组成的序列{a,b,c}。
这个序列有六个可能的排列组合:abc,acb,bac,bca,cab,cba。这些排列组合根据less-than操作符做字典顺序的排序。
也就是说,abc名列第一,因为每一个元素都小于其后的元素。acb是次一个排列组合,因为它是固定了a(序列内最小元素)之后所做的新组合。
同样道理,那些固定b(序列中次小元素)而做的排列组合,在次序上将先于那些固定c而做的排列组合。以bac和bca为例,bac在bca之前,因为次序ac小于序列ca。面对bca,我们可以说其前一个排列组合是bac,而其后一个排列组合是cab。序列abc没有“前一个”排列组合,cba没有“后一个”排列组合。
next_permutation()会取得[first,last)所标示之序列的下一个排列组合,如果没有下一个排列组合,便返回false;否则返回true。
1、输出序列{1,2,3,4}字典序的全排列。
#include <iostream>
#include<algorithm>
using namespace std;
int main(int argc, char** argv) {
int a[4]={1,2,3,4};
sort(a,a+4);//(需要先有序排列)
do{
//cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<endl;
}while(next_permutation(a,a+4));
return 0;
}
2、输入定义四个字符,字典序的全排列
#include <iostream>
#include<algorithm>
using namespace std;
int main(int argc, char** argv) {
char a[4]={'A','B','C','D'};
sort(a,a+4);
do{
//cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<endl;
}while(next_permutation(a,a+4));
return 0;
}
3、输入任意一个字符串,输出其字典序的全排列
#include <iostream>
#include<algorithm>
using namespace std;
int main(int argc, char** argv) {
string str;
cin>>str;
sort(str.begin(),str.end());
do{
cout<<str<<endl;
}while(next_permutation(str.begin(),str.end()));
return 0;
}
3、能否直接算出集合{1, 2, ..., m}的第n个排列?
举例说明:如8个数的集合为{1, 2, 3, 4, 5, 6, 7,8},要求出第n=1234个排列。
n=1,第一个排列为12345678;
n=2,第二个排列为12345687;
#include <iostream>
#include<algorithm>
using namespace std;
int main(int argc, char** argv) {
int a[8]={1,2,3,4,5,6,7,8};
sort(a,a+8);
int n=0;
do{
if(n==1234){
for(int i=0;i<8;i++)
cout<<a[i];
cout<<endl;
break;
}
n++;
}while(next_permutation(a,a+8));
return 0;
}
n=1234,第1234个排列为13745826。
此题目用到next_permutation()全排列方法即可解决。
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int A,B,C,a[10]={0,1,2,3,4,5,6,7,8,9};
//0-9是个数在不同位置,满足(XXXX-XXXX)*XX=900
//(A-B)*C==900
do{
if(a[0]==0||a[4]==0||a[8]==0) continue;
A = a[0]*1000+a[1]*100+a[2]*10+a[3];
B = a[4]*1000+a[5]*100+a[6]*10+a[7];
C = a[8]*10+a[9];
if((A-B)*C==900)
{
printf("(%d-%d)*%d==900\n",A,B,C);
}
}while(next_permutation(a,a+10));
return 0;
}
使用全排列的方法将原始数据进行了全部变量,满足条件的答案如图所示。