题目
标题: 马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是: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 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。
题目分析
预备知识:
乘法交换律: a * b = b * a
该题目可以整理成以下几点:
- 将三位数中间的数字拿出来放到两位数的中间, 更换前后两数的乘积相等.
- 因为有 5 个不同的数字, 每个数字都可能取 1 到 9 不同的数字(不包括 0), 因此使用 5 层 for 循环, 将每个数字都从 1 尝试到 9, 看看是否满足 “ab * cde = adb * ce” 这样的形式.
使用编程解决问题的主要思路就是让程序一步步的满足所有题目给出的条件, 然后就可以通过一片片的循环得到最终的结果.
要满足的条件和对应的编程实现如下:
- 需要有 5 个数字, 每个数字都是从 1 到 9 -> 5 个 for 循环
- 5 个数字要各不相同 : if 判断, 每多出一个数字(每增加一层循环)都要判断这个数字是否与已有的数字相同, 只有与已有的数字不相同才继续向下循环.
解题程序如下:
#include<iostream> #include<stdio.h> //不加这个不能使用 printf()函数 using namespace std; int main(){ int ans = 0; for (int a=1; a<10; a++){ for (int b=1; b<10; b++){ if(b!=a){ for (int c=1; c<10; c++){ if(c!=a&&c!=b){ for(int d=1; d<10; d++){ if(d!=a&&d!=b&&d!=c){ for(int e=1; e<10; e++){ if(e!=a&&e!=b&&e!=c&&e!=d){ //判断是否满足 ab * cde = adb * ce if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e)){ //为了验证结果是否正确, 可以将所有可能的结果都打印出来, 随机抽取几个手动验算 printf("((%d*10+%d)*(%d*100+%d*10+%d)==(%d*100+%d*10+%d)*(%d*10+%d))=%d\n",a,b,c,d,e,a,d,b,c,e,(a*100+d*10+b)*(c*10+e)); ans++; } } } } } } } } } } cout << ans << endl; return 0; }
正确答案是:
142