見證自己成長
福爾摩斯到某古堡探險,看到門上寫着一個奇怪的算式:
ABCDE * ? = EDCBA
他對華生說:“ABCDE應該代表不同的數字,問號也代表某個數字!”
華生:“我猜也是!”
於是,兩人沉默了好久,還是沒有算出合適的結果來。
請你利用計算機的優勢,找到破解的答案。
把 ABCDE 所代表的數字寫出來。
答案寫在“解答.txt”中,不要寫在這裏
解法一思路:將一個五位數逆序之後和原數字再進行 “原數字 * 一個數 = 逆序數 ”的運算,在逆序過程中,爲了保證每個數字都不同,故意將有相同數字的五位數的逆序數變成0,使得判斷條件不滿足而無法輸出。同時爲了實現逆序,自己寫了一個pow函數
*
總體來說:
- 自我感覺自己的代碼很笨重,很多多餘的東西
- 有種被題目牽着鼻子走的感覺,只是讀懂表面,然後完全按照題目表面意思實現,沒有去分析它的本質,導致計算好複雜,循環次數也很多
- 自我批評自我告誡,也提醒可能會有同樣問題的你
*
//我自己的解法
#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;
}