2014年蓝桥杯省赛A组c++第3题(数组构造+暴力求解)

时间:2022-12-10 05:18:09
/*
标题:神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
*/ #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std; /*
如果是初始化,只要定义第一个元素为0,后面就全为0了,如
int a[10] = {0};
如果是在定义以后想全部赋为0,用memset()函数是比较快的。
如:
int a[10];
memset(a, 0, sizeof(int)*10);
*/
int flag[]; //compares the two arrays so as to know if they have the same elements
bool f(int a1[],int a2[])
{
for(int i=;i<;i++)
{
if(a1[i]!=a2[i]) return false;
}
return true;
} int main()
{
for(int i=;i<=;i++)
{
memset(flag, , sizeof(int)*);
int n=i;
int a[] = {};
{
a[]=n/;n=n%;
a[]=n/;n=n%;
a[]=n/;n=n%;
a[]=n;//求每一位的数字
}
n=i;
while(n)//求解i每一位的组成
{
flag[n%]++;
n/=;
//cout<<flag[0]<<flag[1]<<flag[2]<<flag[3]<<flag[4]<<flag[5]<<flag[6]<<flag[7]<<flag[8]<<flag[9]<<flag[10]<<endl;
}
int final[];//存放每一种组合的相乘的结果
{
final[]=(a[])*(a[]*+a[]*+a[]);
final[]=(a[]*+a[])*(+a[]*+a[]);
final[]=(a[]*+a[]*+a[])*(a[]);
}
int flag1[][]={};//存放每个结果的每一位的组成
for(int j=;j<;j++)
{
n=final[j];
while(n)
{
flag1[j][n%]++;
n/=;
}
//cout<<flag1[j][0]<<flag1[j][1]<<flag1[j][2]<<flag1[j][3]<<flag1[j][4]<<flag1[j][5]<<flag1[j][6]<<flag1[j][7]<<flag1[j][8]<<flag1[j][9]<<flag1[j][10]<<endl;
}
bool b;
//case1
if(f(flag,flag1[])) cout<<a[]<<"*"<<a[]*+a[]*+a[]<<"="<<final[]<<endl;
//case2
if(f(flag,flag1[])) cout<<a[]*+a[]<<"*"<<a[]*+a[]<<"="<<final[]<<endl;
//case3
if(f(flag,flag1[])) cout<<a[]*+a[]*+a[]<<"*"<<a[]<<"="<<final[]<<endl;
}
return ;
}

思想并不复杂,就是从1000到9999,把每个数拆分成四位存到一个数组里,
然后考虑每个数,对每一种分解情况考虑两个因子的组成是不是和原数一样,是就输出。
主要是要注意构造好存放每一位的标志数组flag和flag1,因为这两个数组没构造好,导致我浪费了一个小时调试,TNND。

tz@COI HZAU

2018/3/14