10
MATLAB 程程程程程程程 程程程程程程 程程程 (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];

練習題

Embed Size (px)

DESCRIPTION

練習題. (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%) 黑洞數問題 ( 描述 ) - PowerPoint PPT Presentation

Citation preview

Page 1: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 (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];

Page 2: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 (60%) 黑洞數問題 ( 描述 )

將一個「位數不完全相同」的四位數字,經過如下步驟運算,最後將變成「 6174 」

所有位數「由大排到小」減去「由小排到大」 合法: 1234, 0912, 1999, 非法: 8888, 4444, ...

範例: 3087 → 8730-0378→ 8352 → 8532-2358 → 6174 → 7641-1467 → 6174 → ...

本練習題只要求對四位數之計算做設計

Page 3: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 黑洞數問題 ( 規格 )

撰寫一函式計算黑洞數問題,函式名稱自訂 輸入:一合法四位數 輸出:一個向量,從輸入數字開始到黑洞數字為止 例如: blackHoleNum(3087) 要回傳:

[3087 8352 6174]

Page 4: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 黑洞數問題 ( 提示 )

假設輸入數字的變數名稱為 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; % 新的數字

Page 5: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 黑洞數問題 ( 提示 )

function out = blackHoleNum(num)out = num;while(1)

% 步驟一:拆開 num 的每一個位數% 步驟二:小排到大 & 大排到小% 步驟三:將陣列合併回四位數字,並相減 (num = num2-

num1)% 步驟四:向量合併 out = [out num]% 步驟五:如果 num 等於 6174 則 break

end

Page 6: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 ( 加分題 ) (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=106*2=127*2=148*2=169*2=18

1*3= 3 2*3= 6 3*3= 9 4*3=125*3=156*3=187*3=218*3=249*3=27

1*4= 4 2*4= 8 3*4=124*4=165*4=206*4=247*4=288*4=329*4=36

1*5= 5 2*5=103*5=154*5=205*5=256*5=307*5=358*5=409*5=45

1*6= 6 2*6=123*6=184*6=245*6=306*6=367*6=428*6=489*6=54

1*7= 7 2*7=143*7=214*7=285*7=356*7=427*7=498*7=569*7=63

1*8= 8 2*8=163*8=244*8=325*8=406*8=487*8=568*8=649*8=72

1*9= 9 2*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81

Page 7: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 ( 加分題 ) (3%, 各 6%) 分別使用兩層及一層迴圈,完成矩陣乘法

本練習題的目的,在於讓各位熟悉矩陣操作 使用「 * 」運算元,不需要自己寫迴圈 範例 7 當中,使用了三層迴圈

Page 8: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 ( 參考答案 ) 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

Page 9: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 ( 參考答案 ) 黑洞數問題 ( 自行搭配 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;endend

Page 10: 練習題

MATLAB 程式設計入門篇:程式流程控制

練習題 ( 參考答案 ) 九九乘法表修改輸出

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); endend

% 一層for i = 1:n C(:,i) = A*B(:,i);end