天天看點

2012藍橋杯【初賽試題】古堡算式

題目描述:

    福爾摩斯到某古堡探險,看到門上寫着一個奇怪的算式:

    ABCDE * ? = EDCBA

    他對華生說:“ABCDE應該代表不同的數字,問号也代表某個數字!”

    華生:“我猜也是!”

    于是,兩人沉默了好久,還是沒有算出合适的結果來。

    請你利用計算機的優勢,找到破解的答案。

    把 ABCDE 所代表的數字寫出來。

    答案寫在“解答.txt”中,不要寫在這裡! 

思路:此題乍一看有點摸不着頭腦,其實你仔細看,很多細節都藏在題目裡。比如福爾摩斯說的“ABCDE應該代表不同的數字,問号也代表某個數字”,這就是題目給我們的一個非常重要的資訊,即ABCDE是1至9之間不同的數字(不包括0,因為如果0在首位就不滿足五位數),而問号跟簡單,它代表的一定是1到9的某個數字。那麼做題的方法隻需要将1至9取出5個數組合,然後再分别乘以1到9的某個數字看看結果是不是剛好等于第一個數的颠倒數(如12345的颠倒數是54321)即可。

最後找出的正确答案是:21978(21978*4=87912)

#include<stdio.h>
#include<stdlib.h>
int Change(int a[])
{
    int i,n=0;
    for(i=0;i<5;i++)
    n=n*10+a[i];
    return n;
}
int main()
{
    int i,j,k,l,t,n,m,flag,a[6],b[6];
    flag=0;
    for(i=1;i<=9;i++)
    {
       a[0]=i;b[4]=i;if(flag==1)break;
       for(j=1;j<=9;j++)
       {
          a[1]=j;b[3]=j;if(flag==1)break;
          for(k=1;k<=9;k++)
          {
             a[2]=k;b[2]=k;if(flag==1)break;
             for(l=1;l<=9;l++)
             {
               a[3]=l;b[1]=l;if(flag==1)break;
               for(t=1;t<=9;t++)
               {
                 a[4]=t;b[0]=t;if(flag==1)break;
                 for(m=2;m<=9;m++)
                 {
                    if(Change(a)*m==Change(b))
                    {
                       printf("%d*%d=%d\n",Change(a),m,Change(b));
                       flag=1;
                    }
                 }
               }
             }
          }
       }
    }
    system("pause");
    return 0;
}
           

用的方法比較原始,如果求的位數多的話可能會逾時,期待更優化的方法

繼續閱讀