藍橋杯~古堡算式

見證自己成長

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

ABCDE * ? = EDCBA

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

華生:“我猜也是!”

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

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

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

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

解法一思路:將一個五位數逆序之後和原數字再進行 “原數字 * 一個數 = 逆序數 ”的運算,在逆序過程中,爲了保證每個數字都不同,故意將有相同數字的五位數的逆序數變成0,使得判斷條件不滿足而無法輸出。同時爲了實現逆序,自己寫了一個pow函數

*

總體來說:

  1. 自我感覺自己的代碼很笨重,很多多餘的東西
  2. 有種被題目牽着鼻子走的感覺,只是讀懂表面,然後完全按照題目表面意思實現,沒有去分析它的本質,導致計算好複雜,循環次數也很多
  3. 自我批評自我告誡,也提醒可能會有同樣問題的你

*

//我自己的解法
#include<iostream>
using namespace std;

int pow( int x,int n)
{
    int y = x;
    if( n == 0)
        return 1;   //滿足一個數的零次冪爲1
    for(int i = 0; i < n - 1; i++)
        x *= y;
    return x;
}

int Reverse(int x,int sum )
{
    sum = 0;
    int a[6];
    for(int i = 4; i >= 0; i--) {
        int n;
        a[i] = x % 10;
        x /= 10;
        for(int j = 4; j > i; j--)  //判斷是否有重複
            if(a[i] == a[j])
                return 0;           //故意將有重複數字的逆序數變成0

        sum += a[i] * pow(10,i);

    }

    return sum;
}

int main(void)
{
    int x,sum;

    for( int x = 10000; x <= 99999; x++)
        // i 從2 開始,因爲 1 的話只有5個數關於中間那個數對稱的纔會滿足條件,所以1 是沒有意義的
        for( int i = 2; i <= 9; i++)    
            if( x * i == Reverse(x,sum) )
                cout << x  << endl;

    return 0;
}

解法二思路:這個思路很清晰,就是將A,B,C,D,E按照單純的數字來看,然後在每一層循環後嵌套一個判斷條件,從而能夠相對的減少循環次數,最後將數字合併,然後判斷。
*
簡單好理解,雖說沒有什麼算法可言,起碼可以很快的實現,適合像我一樣的小白啊哈

    *
//解法二:網上參考的解法,自己實現的,感覺思路更清晰
#include<iostream>
using namespace std;

int main(void)
{
    for( int i = 1; i < 10; i++)
        for( int j = 0; j < 10; j++) {
            if( i == j)
                continue;
            for( int k = 0; k < 10; k++) {
                if( j == k || k == i)
                    continue;
                for( int l = 0; l < 10; l++) {
                    if( l == k || k == i || k == j)
                        continue;
                    for( int m = 0; m < 10; m++) {
                        if( m == l || m == k || m == j || m == i)
                            continue;
                        int n = i*10000 + j*1000 + k*100 + l*10 + m;
                        int p = m*10000 + l*1000 + k*100 + j*10 + i;
                        for( int q = 2; q < 10; q++)
                            if( n * q == p )
                                cout << n << endl;
                    }
                }
            }
        }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章