一个五位数字ABCDE*4=EDCBA,这五个数字不重复,请编程求出来.

一个五位数字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
int calc()
{
int i;
for(i=20008;i<25000;i++)//A是2,E是8是很容易猜出来的
//从ABCDE*4=一个五位数可知,ABCDE<25000因为大于或等于25000的数乘以4是六位数
{
int right=0;
int left=i;
while(left!=0)
{
right=right*10+left;
left/=10;
}
if((i<<2)==right)//移位表翻倍
{
return i;
}
}
return -1;
}
void main()
{
printf("the result is :%d\n",calc());
}

如果要求:不准用for,while,if,switch语句????

只能用递归了。。。,这里给出一个递归的算法:

#include
int result(int i)
{
int a,b,c,d,e;
int left,right;
a=i/10000;
b=(i/1000);
c=(i/100);
d=(i/10);
e=i;
right=e*10000+d*1000+c*100+b*10+a;
left=i*4;
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:result(i-1));
}
void main(void)
{
int i=25000;
printf("the result is :%d\n",result(i));
}

你可能感兴趣的:(C编程)