Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4235367
  • 博文数量: 176
  • 博客积分: 10059
  • 博客等级: 上将
  • 技术积分: 4681
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-24 12:27
文章分类

全部博文(176)

文章存档

2012年(1)

2011年(4)

2010年(14)

2009年(71)

2008年(103)

分类:

2008-11-27 23:01:42

一个五位数字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));
}

阅读(11277) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~