题目:
标题:神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
思路:除了暴力,还有别的思路?
#include<iostream>
#include<cstring>
using namespace std;
int arr[]={0,1,2,6},sum=0;
int vis[4]={0};
int fun(int x)
{
if(x<1000||x>10000) return 0;
memset(vis,0,sizeof(vis));
while(x)
{
int a=x%10,i;
x/=10;
for( i=0;i<4;i++){
if(a==arr[i]&&!vis[i])
{
vis[i]=1;
break;
}
}
if(i==4)
return 0;
}
return 1;
}
void f(int n)
{
if(n==4){
//cout<<arr[0]<<arr[1]<<arr[2]<<arr[3]<<endl;
if(fun(arr[0]*(arr[1]*100+arr[2]*10+arr[3])))
{
//cout<<arr[0]<<arr[1]<<arr[2]<<arr[3]<<"="<<arr[0]*(arr[1]*100+arr[2]*10+arr[3])<<endl;
sum++;
}
if(fun((arr[0]*10+arr[1])*(arr[2]*10+arr[3])))
{
//cout<<arr[0]<<arr[1]<<arr[2]<<arr[3]<<"="<<(arr[0]*10+arr[1])*(arr[2]*10+arr[3])<<endl;
sum++;
}
if(fun((arr[0]*100+arr[1]*10+arr[2])*arr[3]))
{
//cout<<arr[0]<<arr[1]<<arr[2]<<arr[3]<<"="<<(arr[0]*100+arr[1]*10+arr[2])*arr[3]<<endl;
sum++;
}
}
for(int i=n;i<4;i++){
int t=arr[i];
arr[i]=arr[n];
arr[n]=t;
f(n+1);
t=arr[i];
arr[i]=arr[n];
arr[n]=t;
}
}
int main()
{
for(int a=0;a<7;a++)
{
for(int b=a+1;b<8;b++)
{
for(int c=b+1;c<9;c++)
{
for(int d=c+1;d<10;d++){
arr[0]=a;
arr[1]=b;
arr[2]=c;
arr[3]=d;
f(0);
}
}
}
}
//f(0);
cout<<sum/2;
return 0;
}
题目:
标题:神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
思路:除了暴力,还有别的思路吗