您的位置:首页 > 其它

蓝桥杯 神奇的算式

2016-05-03 09:40 246 查看
题目:

标题:神奇算式

由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
;
arr
=t;
f(n+1);
t=arr[i];
arr[i]=arr
;
arr
=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种情况,一共有多少种满足要求的算式。

请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。

思路:除了暴力,还有别的思路吗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: