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<iostream> 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<<num<<endl; return 0; }
输出结果为142;
评价:这个题目是典型的通过递归方法来做的题目,多练习几道这类题目,掌握其一般形式和规律。