啊哈c语言——5.8逻辑挑战10(解决奥数难题)

        请在两个□内填入相同的数字使得等式成立:□3×6528=3□×8256。

        这是一个很简单的小学三年级的奥数题目,或许你可以通过口算轻而易举地解决。没有关系,我们这里只是做一个引子来看如何通过编程解决。□内所填的数是1~9的某一个数,最简单的方法就是一个一个地去试。我们的计算机最擅长的就是“不厌其烦”地重复做同一件事情,而且运行速度还非常快,即使你现在用的是市面上最坏最坏的计算机,它1秒钟仍然可以计算100 000 000次以上。好了,言归正传,还是来看看如何通过编程解决吧。我们只需写一个循环,让变量i从1到9循环就好了,然后每次循环只需判断一下当前的i是否符合这个等式的条件,如果符合就输出其值。

 

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i;
    for(i=1; i<=9; i++)
    {
        if( (i*10+3)*6528 == (30+i)*8256 )
        printf("%d", i);
    }
    system("pause");
    return 0;
}

        再来看一个稍微复杂的:

        在上面的算式中,A、B、C、D、E分别代表5个互不相同的整数, 请问A、B、C、D、E分别为多少时算式才会成立?请输出这个算式。

        分析完题目后,你会发现这个题目和上面的题目是差不多的,只要 ABCD×E的积等于DCBA成立就输出。A、B、C、D、E的取值范围只可能是0~9。因此这里可以用5个嵌套循环来解决这个问题。代码如下: 

for(a=0; a<=9; a++)
    {
        for(b=0; b<=9; b++)
        {
            for(c=0; c<=9; c++)
            {
                for(d=0; d<=9; d++)
                {
                    for(e=0; e<=9; e++)
                    {
                        //进行判断
                    }
                }
            }
        }
    }

        接下来就是判断,首先A、B、C、D、E这5个数要互不相等:

if( a! =b && a! =c && a! =d && a! =e
          && b! =c && b! =d && b! =e
          && c! =d && c! =e
          && d! =e )
{
    //有待进一步判断
}

        再进一步判断ABCD×E的积等于DCBA是否成立,如果成立则输出:

if( (a*1000+b*100+c*10+d)*e == (d*1000+c*100+b*10+a) )
{
    printf("%d%d%d%d\n", a, b, c, d);
    printf("* %d\n", e);
    printf("-----\n");
    printf("%d%d%d%d\n", d, c, b, a);
}

        好了,下面是完整的代码,赶快试一试吧。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a, b, c, d, e;
    for(a=0; a<=9; a++)
    {
        for(b=0; b<=9; b++)
        {
            for(c=0; c<=9; c++)
            {
                for(d=0; d<=9; d++)
                {
                    for(e=0; e<=9; e++)
                    {
                        if( a! =b && a! =c && a! =d && a! =e
                                  && b! =c && b! =d && b! =e
                                           && c! =d && c! =e
                                           && d! =e )
                        {
                            if( (a*1000+b*100+c*10+d)*e ==
                            (d*1000+c*100+b*10+a) )
                            {
                                printf("%d%d%d%d\n", a, b, c, d);
                                printf("* %d\n", e);
                                printf("----\n");
                                printf("%d%d%d%d\n", d, c, b, a);
                            }
                        }
                    }
                }
            }
        }
    }
    system("pause");
    return 0;
}

        运行结果如图下方所示:

更进一步,动手试一试

        用1~6这6个自然数组成一个三角形,并让这个三角形三条边上数字之和相等。例如,如图5-2所示的三角形中,三条边的值之和分别为:5+3+4、4+2+6、5+1+6,都等于12。那么现在请你输出所有的可能。 

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a,b,c,d,e,f;
	for(a=1; a<=6; a++)
	{
		for(b=1; b<=6; b++)
		{
			for(c=1; c<=6; c++)
			{
				for(d=1; d<=6; d++)
				{
					for(e=1; e<=6; e++)
					{
						for(f=1;f<=6;f++)
						{
							if( a!=b && a!=c && a!=d && a!=e && a!=f
									 && b!=c && b!=d && b!=e && b!=f
								   		 	 && c!=d && c!=e && c!=f
													 && d!=e && d!=f
												 		     && e!=f )
							{
								if(a+b+d==12 && d+e+f==12 && a+c+f==12)
								{
									printf("  %d\n", a);
									printf(" %d %d\n", b,c);
									printf("%d %d %d\n\n",d,e,f);
								}
								//else
								//printf ("no\n");
							}
						}
					}
				}
			}
		}
	}
	system("pause");
	return 0;
}

 运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值