由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。做了部分历年题,发现全排列真的是一个解题的突破口。
#include <bits/stdc++.h>
using namespace std;
int vis[20];
int vis2[10000];
bool judge(int x,int i,int j,int q,int m)
{
while(x > 0)
{
vis[x%10]++;
x = x/10;
}
if(vis[i]&&vis[j]&&vis[q]&&vis[m])
return true;
return false;
}
int main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int ans =0;
do{
memset(vis,0,sizeof(vis));
if(judge(a[0]*(a[1]*100+a[2]*10+a[3]),a[0],a[1],a[2],a[3]))
{
if(vis2[a[0]*(a[1]*100+a[2]*10+a[3])] == 0)
ans++;
vis2[a[0]*(a[1]*100+a[2]*10+a[3])] = 1;
}
memset(vis,0,sizeof(vis));
if(judge((a[0]*10+a[1])*(a[2]*10+a[3]),a[0],a[1],a[2],a[3]))
{
if(vis[(a[0]*10+a[1])*(a[2]*10+a[3])] == 0)
ans++;
vis[(a[0]*10+a[1])*(a[2]*10+a[3])] = 1;
}
}
while(next_permutation(a,a+10));
cout<<ans<<endl;
return 0;
}