程式設計之美 第四章 數字之趣 4 10數字啞謎和回文

2021-07-04 06:33:55 字數 2704 閱讀 4976

/*

數字啞謎和回文:

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在三角形內,所有的垂線交點都在三角形的邊線之內。如果點...