一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.
先给一个网友的纯的推理过程:
ABCDE*4=EDCBA
很显然,A不是1,就是2,为0就不是五位数,为> 2则乘积不会是五位数
因为4*E的个位数是A,则A=2
所以题目变成2BCDE*4=EDCB2
显然,E是8(原因,乘以4个位为2的只有3,8,而根据高位2*4> =8,它只能为8
所以变成2BCD8 * 4 = 8DCB2
既然BCD8*4没有进位,因此B只能是0,1,2
假设B=0,则CD8*4=DC02, 4*D的尾数必须为7,这肯定不可能
假设B=1,则1CD8*4 = DC12,4*D的个位数为8,D必然=7,因为1*4> 2
1C78*4=7C12 C*4 = 30+C-3, C=9,满足
假设B=2,则2CD8 * 4= DC22, D=8或者9,根据C等于4*D+3的个位,可以得出C等于5或者9
所以等式必须为2588 *4 或者2998*4,很显然都不满足
所以只能是(A,b,C,d,e)=(2,1,9,7,8)
下面给出一个遍历的C语言解法:
#include <stdio.h>
int calc ()
{
for (int i=10001; i<100000; i++)
{
int right = 0;
int left = i;
while ( left != 0 ) /*求右边的值*/
{
right = right * 10 + left % 10;
left /= 10;
}
if ( (i << 2) == right )
{
return i;
}
}
return -1;
}
void main(void)
{
printf("the result is : %d\n", calc());
}
如果要求:不准用for,while,if,switch语句????
只能用递归了。。。,这里给出一个递归的算法:
#include <stdio.h>
int result (int i)
{
int a,b,c,d,e;
a = i / 10000;
b = ( i / 1000 ) % 10;
c = ( i / 100 ) % 10;
d = ( i / 10 ) % 10;
e = i % 10;
int right = e * 10000 + d * 1000 + c * 100 + b * 10 + a;
int left = i * 4;
/*如果相等就返回当前i值,说明找到;如果不相等,就递归找下一个*/
return ( ((right==left && a!=b && a!=c && a!=d && a!=e && b!=c && b!=d && b!=e && c!=d && c!=e && d!=e && i>10000 ) || i <= 10000) ? i : result(i-1) );
}
void main(void)
{
int i = 25000;
printf("the result is : %d\n", result(i));
}
|
阅读(11288) | 评论(0) | 转发(0) |