在面试宝典上面看到的一道题目,也是一道老掉牙的题目了,题目详情:一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.
网上流传的代码都是对5位数ABCDE的所有可能情况作遍历,即从10000-99999;我的想法是把对EDCBA作遍历,从遍历的范围来说,为原来的1/4,因为EDCBA必须能被4整除才可以,然后遍历的初始位置也发生改变,本来是10000,现在直接变成10000*4,范围又减少了一半左右。对于这道程序来说,效果并不明显,我仅仅是提供另一种思路,用逆向的思维来解答问题。对于题目中的要求:每个数字必须不重复,在数学的角度来说,这应该是不会重复的,要加上这个不重复的条件也可以,只是程序会变得繁琐不简洁。对这道题来说,加不加影响不大。
用EDCBA来遍历的代码如下:
#include#includeintfindNUM(void){intcnt=0;intN=0;//EDCBAintNswitch=0;//ABCDEfor(cnt=10000*4;cnt<=99999;cnt+=4)//初始位置是40000,因为ABCDE最小为10000,那EDCBA最小为40000{Nswitch=0;N=cnt;//将EDCBA变换为ABCDEdo{Nswitch=Nswitch*10+N%10;N/=10;}while(N!=0);if((cnt>>2)==Nswitch){returncnt;//找到该数并返回}}return-1;//找不到,返回-1}intmain(void){intresult=findNUM();switch(result){case-1:{printf("thenumberisn'texist!\n");break;}default:{printf("theABCDEis%d\n",result/4);printf("theEDCBAis%d\n",result);break;}}return0;}