2013蓝桥杯 【初赛试题】 马虎的算式


标题: 马虎的算式

    小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

    有一次,老师出的题目是:36 x 495 = ?

    他却给抄成了:396 x 45 = ?

    但结果却很戏剧性,他的答案竟然是对的!!

    因为 36 * 495 = 396 * 45 = 17820

    类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

    假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

    能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

答案直接通过浏览器提交。

注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。


题目分析:

典型的可以通过递归来做的题目,5个数表示了递归的层数;

我们从第一个数开始进行递归,对第一个数a遍历所有可能取到的值,然后进行下一层递归;

对第二个数b遍历所有可能取到的值,然后对这些值进行判断是否符合条件(对b和a的关系进行判断),如果不符合条件则停止递归,如果符合条件则进入下一层递归;

……

直到进入了第五层递归,如果e的值也符合条件,则对abcde进行判断,看时候符合条件ab * cde = adb * ce,符合条件则计数器加1.


#include
using namespace std;
int num=0;
bool check(int *a,int n)
{
	for(int i=n-1;i>=0;i--)
		if(a[i]==a[n])return false;
	return true;
}
void next(int *a,int n)
{
	int num1=a[0]*10+a[1];
	int num2=a[2]*100+a[3]*10+a[4];
	int num3=a[0]*100+a[3]*10+a[1];
	int num4=a[2]*10+a[4];
	if(num1*num2==num3*num4)
		num++;
}
void fun(int *a,int n)
{
	if(n==5)next(a,5);
	else
	{
		for(int i=1;i<10;i++)
		{
			a[n] = i;
			if(check(a,n))
				fun(a,n+1);
		}
	}
}
int main()
{
	int a[5];
	fun(a,0);
	cout<

输出结果为142;


评价:这个题目是典型的通过递归方法来做的题目,多练习几道这类题目,掌握其一般形式和规律。


转载于:https://www.cnblogs.com/zhezh/p/3773479.html

你可能感兴趣的:(2013蓝桥杯 【初赛试题】 马虎的算式)