您的位置:首页 > 其它

第五届蓝桥杯软件类省赛真题-C-A-3_神奇算式

2017-01-17 18:54 295 查看
/*【题目】

标题:神奇算式

由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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: