/*【题目】
标题:神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,
一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
*/
/*【解题思路】
解法一:暴力枚举
注意灵活应用数组下标和标记数组
(其中:x * y == z)
解法一:递归遍历访问
答案:12种
*/
#include<iostream>
#include<cstring>
using namespace std;
int count = 0;//此变量用于表示满足要求的算式种数
int num[10] = {0};//此数组用于表示数字0~9被用了几次,下标 0~9 用于表示数字
int visit[10] = {0};//此为备份数组用于表示数字0~9被访问了几次,下标 0~9 用于表示数字
/*
* @简介:检测判断数字n是否满足各位上的数字只出现一次的条件,
* 并且将各位上的数字出现次数存于num[]数组中
* @参数:n表示要检测的数字
* @返回: 满足条件返回true,否则返回false
*/
bool isSolution_1(int n)
{
do
{
if(num[n%10] != 0)
return false;
num[n%10]++;
}while(n/=10);
return true;
}
/*
* @简介:检测判断数字x、y是否满足各位上的数字在num[]标记数组中都只出现一次的条件
* @参数:x、y表示要检测的数字
* @返回: 满足条件返回true,否则返回false
*/
bool isSolution_2(int x,int y)
{
do
{
if(visit[x%10] <= 0)
return false;
visit[x%10]--;
}while(x /= 10);
do
{
if(visit[y%10] <= 0)
return false;
visit[y%10]--;
}while(y /= 10);
return true;
}
int main()
{
int x,y,z;//表示算式上的三个整数:x * y == z
for(z=1000;z<10000;z++)
{
memset(num,0,sizeof(num));
if(!isSolution_1(z))
continue;
for(x=1;x<100;x++)
{
memcpy(visit,num,sizeof(num));
if(z % x != 0)
continue;
y = z/x;
if(y<x)//因为x取值范围是1~100,两位数,所以另一个因子y的位数必将大于等于x
continue;
if(!isSolution_2(x,y))
continue;
count++;
cout<<x<<'*'<<y<<'='<<z<<endl;
}
}
cout<<"满足要求的算式一共有: "<<count<<" 种"<<endl;
return 0;
}
第五届蓝桥杯软件类省赛真题-C-A-3_神奇算式
最新推荐文章于 2019-03-19 08:56:00 发布