题目题干
7254是一个不寻常的数,因为它可以表示为7254 = 39 x 186,这个式子中1~9每个数字正好出现一次,输出所有这样的不同的式子(乘数交换被认为是相同的式子)。结果小的先输出;结果相同的,较小的乘数较小的先输出。
解题思路
拿到题目的时候,我们其实可以意识到一个很明显的事实
1.这个式子只能在1~9之中进行选取,也就是说——
结果 = 数one x 数two
结果位数 + 数one位数 + 数two位数 = 9位
我们可以发现当结果为五位数时,数one和数two相乘不管怎么样也达不成。因为就算极端情况99 x 99也是小于100 x 100。也就是五位数。
同理当结果为3位数时,数one&two不管怎么样相乘都不会这么小。
所以结果只能为4位数,此时有两种情况一种是个位数x4位数,一种是3位数x2位数。
当我们意识到这点时我们就可以锁定,数值大概得位置,我们就可以用可以将他们比作成一个数组,给变量赋值,并且通过循环判断语句,来输出我们的结果。
代码部分
#include<iostream>
#include<algorithm> //我们的全排列函数所在的库,在这里调用
using namespace std;
void compcout(int res,int multione,int multitwo) //判断等式是否成立,输出结果的函数
{
if (res==multione*multitwo)
{
cout<<res<<" = "<<multione<<" x "<<multitwo<<endl;
}
}
void identity(int num[])
{
while (next_permutation(num,num+9)) //全排列函数
{
int res;
int x1,y1; //设置两个变量是因为,相乘的两数位数不同
int x2,y2;
res=num[0]*1000+num[1]*100+num[2]*10+num[3];
x1=num[4];
y1=num[5]*1000+num[6]*100+num[7]*10+num[8];
compcout(res,x1,y1);
res=num[0]*1000+num[1]*100+num[2]*10+num[3];
x2=num[4]*10+num[5];
y2=num[6]*100+num[7]*10+num[8];
compcout(res,x2,y2);
}
}
int main()
{
int num[9]={1,2,3,4,5,6,7,8,9}; //题目中1-9之中进行取值
identity(num);
return 0;
}
所得结果
运行结果:
其中我们要注意输出时的空格哟
心得
1.需要自己仔细审题,不要将思维局限,获得所需条件。
2.多调用使用现成的库函数,可以提高我们的效率。
ps:因为是全排列的函数,我们其实可以发现他其实是按照字典排列,也就是由小及大,并且一一列举。并且全排列,一般是作用于数组,是从后寻找的。
3.在输出时,记得格式要正确。