100 likes | 399 Views
練習題. (40%) 將「 3n+1 問題」範例,包裝成函式 自訂一個合法函式名稱 輸入為起始數字,例如 123 輸出為「末項 =1 」的數列,代表其經過的數字 例: threeNPlusOne(13) 要回傳: [13 40 20 10 5 16 8 4 2 1] 提示: 定義列: function out = threeNPlusOne(num) 一開始,先將 out 設為 num : out=num; 將原本印出的部分,改成向量合併: out = [out num];. 練習題. (60%) 黑洞數問題 ( 描述 )
E N D
練習題 • (40%)將「3n+1問題」範例,包裝成函式 • 自訂一個合法函式名稱 • 輸入為起始數字,例如123 • 輸出為「末項=1」的數列,代表其經過的數字 • 例:threeNPlusOne(13)要回傳: • [13 40 20 10 5 16 8 4 2 1] • 提示: • 定義列:function out = threeNPlusOne(num) • 一開始,先將out設為num:out=num; • 將原本印出的部分,改成向量合併:out = [out num];
練習題 • (60%)黑洞數問題(描述) • 將一個「位數不完全相同」的四位數字,經過如下步驟運算,最後將變成「6174」 • 所有位數「由大排到小」減去「由小排到大」 • 合法:1234, 0912, 1999, • 非法:8888, 4444, ... • 範例: 3087→ 8730-0378→8352→ 8532-2358 →6174→ 7641-1467 → 6174→ ... • 本練習題只要求對四位數之計算做設計
練習題 • 黑洞數問題(規格) • 撰寫一函式計算黑洞數問題,函式名稱自訂 • 輸入:一合法四位數 • 輸出:一個向量,從輸入數字開始到黑洞數字為止 • 例如:blackHoleNum(3087)要回傳: • [3087 8352 6174]
練習題 • 黑洞數問題(提示) • 假設輸入數字的變數名稱為num • 把位數拆開 array = [getDigit(num,1) getDigit(num,2) getDigit(num,3) getDigit(num,4)] • 小排到大:xx = sort(array) • 大排到小:yy = fliplr(xx) • 如何將陣列(變數xx與yy)合併回數字? num1 = str2num( num2str(xx,'%d%d%d%d') ); % 小的數字 num2 = str2num( num2str(yy,'%d%d%d%d') ); % 大的數字 • num = num2 - num1; % 新的數字
練習題 • 黑洞數問題(提示) function out = blackHoleNum(num) out = num; while(1) % 步驟一:拆開num的每一個位數 % 步驟二:小排到大 & 大排到小 % 步驟三:將陣列合併回四位數字,並相減(num = num2-num1) % 步驟四:向量合併 out = [out num] % 步驟五:如果num等於6174則break end
練習題(加分題) • (3%)修改「九九乘法表」範例,使輸出如下 1*1= 1 2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1= 6 7*1= 7 8*1= 8 9*1= 9 1*2= 2 2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18 1*3= 3 2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27 1*4= 4 2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36 1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45 1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54 1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63 1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72 1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
練習題(加分題) • (3%, 各6%)分別使用兩層及一層迴圈,完成矩陣乘法 • 本練習題的目的,在於讓各位熟悉矩陣操作 • 使用「*」運算元,不需要自己寫迴圈 • 範例7當中,使用了三層迴圈
練習題(參考答案) • 3n+1問題 function out = threeNPlusOne(num) out = num; while(num~=1) if(0==rem(num,2)) num = num / 2; else num = num * 3 + 1; end out = [out num]; end
練習題(參考答案) • 黑洞數問題(自行搭配getDigit使用) function out = blackHoleNum(num) out = num; while(1) array = [getDigit(num,1) getDigit(num,2) getDigit(num,3) getDigit(num,4)]; xx = sort(array); yy = fliplr(xx); num1 = str2num( num2str(xx,'%d%d%d%d') );% 小的數字 num2 = str2num( num2str(yy,'%d%d%d%d') ); % 大的數字 num = num2 - num1; % 新的數字 out = [out num]; if(num==6174),break;end end
練習題(參考答案) • 九九乘法表修改輸出 for i=1:9 for j = 1:9 fprintf('%d*%d=%2d\t',j, i, i*j); end fprintf('\n'); end • 兩層/一層迴圈矩陣相乘 % 兩層 for i = 1:m for j = 1:n C(i,j) = A(i,:)*B(:,j); end end % 一層 for i = 1:n C(:,i) = A*B(:,i); end