/*
數字啞謎和回文:
1神奇的9位數。能不能找出符合如下條件的9位數:
這個數包括了1~9這9個數字;
這個9位數的前n位都能被n整除,若這個數表示為abcdefghi,則ab可以被2整除,abc可以被3整除......abcdefghi可以被9整除
2有這樣乙個乘法算式:
人過大佛寺*我=寺佛大過人
這裡面每乙個字都代表著乙個數字,並且不同的字代表的數字不同,你能把這些數字都找出來嗎?
分析:問題1的解法1:
假設這個9位數是abcdefghi,,誒個字元對應1~9之間的數。可以考慮剪枝來優化效能。
剪枝=避開死胡同,把搜尋比作遍歷一棵樹,那麼剪枝就是講數中的一些不能到達的枝條剪掉。
比如迴圈到b等於奇數時,ab必須被2整除,b必須為偶數。
問題1的解法2:
試一試用邏輯推理的辦法來求解這個問題,假設每個字元目前都可以對應1~9之間的任何數字。
a 1 2 3 4 5 6 7 8 9
b 1 2 3 4 5 6 7 8 9
c 1 2 3 4 5 6 7 8 9
d 1 2 3 4 5 6 7 8 9
e 1 2 3 4 5 6 7 8 9
f 1 2 3 4 5 6 7 8 9
g 1 2 3 4 5 6 7 8 9
h 1 2 3 4 5 6 7 8 9
i 1 2 3 4 5 6 7 8 9
把整除的條件列出來,
a被1整除,任何數都滿足這個條件,
b為0,2,4,6,8
abc必須被3整除,那麼a+b+c=3*k
abcd必須被4整除,那麼d必須為2,4,6,8,cd被4整除
abcde被5整除,e為5(0為什麼不可能,因為是1~9,沒有0)
abcdef被6整除,f = 2,4,6,8,a+b+c+d+e+f=3*k,不易想到
abcdefg被7整除,abcd -efg能被7整除(考慮到7能整除1001),不易想到
abcdefgh被8整除,h = 2,4,6,8,fgh能被8整除,不易想到
abcdefghi被9整除,a+b+c+d+e+f+g+h+i=9*k,不易想到
範圍如下:
a 1 3 7 9
b 2 4 6 8
c 1 3 7 9
d 2 4 6 8
e 5f 2 4 6 8
g 1 3 7 9
h 2 4 6 8
i 1 3 7 9
下面條件:
a+b+c被3整除
cd被4整除
d+e+f被3整除
abcd-efg能被7整除
fgh能被8整除
因為d +e +f被3整除,而e = 5,則d + f = 3k + 1形式
} return true;
}int ninebitnum_base()//基本方法,剪枝的不多
for(int b = 2 ; b <= 8 ; b += 2)
for(int c = 1; c <= 9 ; c += 2)
for(int d = 2 ; d <= 8 ; d += 2)
for(int h = 2 ; h <= 8; h += 2)
for(int i = 1 ; i <= 9 ; i += 2)
//if((a + b + c) % 3 == 0 && (10*c + d) % 4 == 0 && (d + e + f) % 3 == 0 && (100*f + 10*g + h) % 8 == 0 &&
// (1000*a + 100*b + 10*c +d - 100*e - 10*f -g) % 7 == 0) //(a*1e6 + b*1e5 + c*1e4 + d*1e3 + e*1e2 + 10*f + g) % 7 == 0)
if((a + b + c) % 3 == 0 && (10*c + d) % 4 == 0 && (d + e + f) % 3 == 0 && (100*f + 10*g + h) % 8 == 0
&& (a*1000000 + b*100000 + c*10000 + d*1000 + e*100 + f*10 + g) % 7 == 0
&& isdifferent(a,b,c,d,e,f,g,h,i))}}
}}
} return -1;
}long ninebitnum_pruning()//pruning剪枝,限制條件更多
for(int b = 4 ; b <= 8 ; b += 4)
for(int d = 2 ; d <= 6 ; d += 4)
for(int h = 2 ; h <= 6; h += 4)
if((a + b + c) % 3 == 0 && (1000*a + 100*b + 10*c + d - 100*e - 10*f -g) % 7 == 0
&& isdifferent(a,b,c,d,e,f,g,h,i))}}
}}}}
} }return -1;
}int isvalid(int a,int b,int c,int d,int e,int f,int g,int h,int i)
return -1;
}void process()
int main(int argc,char* argv)
程式設計之美 第四章 數字之趣 4 2瓷磚覆蓋地板
瓷磚覆蓋地板 原來的地板鋪有n m塊正方形瓷磚,商店只提供長方形瓷磚,現在一塊長方形瓷磚相當於於原來的兩塊正方形瓷磚,能否用1 2的瓷磚去覆蓋n m的地板呢 本質 斐波那契遞推數列公式 f i f i 1 f i 2 分析 n m的地板有以下幾種可能 1如果n 1,m為偶數的話,顯然1 2的瓷磚可以...
第四章 程式設計
選擇語言的原則 最少的工作量原則 最少技巧性原則 最少錯誤原則 最少維護原則 減少記憶原則 總原則 先求正確後求快 先求清晰後求快 求快不忘保持程式正確性 保持程式整潔以求快 不要因效率而犧牲清晰 好程式標準 易於測試和除錯 易於維護 易於修改 設計簡單 高效率結構化程式設計主要包括兩方面 在編寫程...
程式設計之美 第四章 數字之趣 4 4點是否在三角形內
點是否在三角形內 如果乙個二維座標系中,已知三角形頂點的座標,那麼對於座標系中的任意一點,如何判斷該點是否在三角形內 點在三角形邊線上也可 假設三角形頂點的座標為abc 逆時針 需要判斷點d是否在該三角形內。分析 利用垂涎的交點可以判斷。如果點d在三角形內,所有的垂線交點都在三角形的邊線之內。如果點...