2016年5月14日 星期六

2016年5月12日 星期四

To P1A,P1B 補變三、變四

變化三:費氏數列
 f0=1f1=1f2=2f3=3f4=5f5=8f6=13、...、f20=10946、...、
     f50=20365011074、...、f70=308061521170129、...、f90=4660046610375530309
   輸入 n , 0<=n<=90,請問 fn的值,若費氏計算機只顯示最右8位數,小於8位靠右顯示,
左邊空格以^表示,則f29顯示「^^832040」,又f50=20365011074顯示「65011074」,而
f39=102334155顯示「02334155, f76=5527939700884757顯示「00884757
需宣告long long f0,f1,f2後設定f0=1,f1=1, 輸入n
for(i=2 n )
{
    f2 = f0+f1;  //每新的 i 時重算 f2
    f0=f1;  //下一個 i f1變成f0
    f1=f2;  //下一個 i f2變成f1
}
因為只印8位,設 k = f2 10^8取餘數
k等於f2左邊補^,否則補0
  if(k==f2) cout << setw(8) << setfill('^') << k << endl;
  else cout << setw(8) << setfill('0') << k << endl;

變化四:判斷可否被11整除
 如果是long long int 可存範圍正整數 n <=2^63-1 = 9223372036854775807{9.22*10^18}
比照a024所有位數和,但分奇數位的和odd及偶數位的和even,若odd-even可被11整除的話,則 n 也可被11整除。{這樣解題時只要加個if判斷是奇數位就加至odd、偶數位就加至even}

 但如果n的位數超出19位數怎麼辦?假設n不超過30位數,為了可以使用long long整數讀,
我們將n切成n1n2兩部份,並且在n1n2之前加d1d2代表各幾位數
例如: n901234567890123456789共有21位數將之分為11位及10位,則輸入 d1  n1  d2  n2
11  
90123456789  10 123456789 ,這樣就可以輸入,也可以分別算 n1n2的奇數位及偶數位
就是給 d1  n1  d2  n2  11  90123456789  10 123456789 就是問 901234567890123456789
是否可被 11 整除?  {n2的前面有0時不會讀入,所以要判斷d2的位數自己算前導0的位數}

假設有一 22位數 n=7,251,000,000,000,000,000,218分成 8位、右14位,
則輸入d1, n1 , d2, n2 就是   8  72510000  14  218
宣告兩個變數oddeven分別設為0代表奇位數和及偶位和,以最右為第1
for(i=1; n2!=0; ++i)  //  n2 每次切1位,最後為0時就停
{
    n2 末位切掉{ c = n2%10 n2/=10 }
   i是奇數位則  加至 odd ,偶數位則 加至 even
}

接著同上處理 n1, i=d2+1開始 {n1=72510000最右1位是原數n的第14+1}

判斷 odd even 的差是否為 11的倍數 就是判斷 n 是否被11整除


給P1A、P1B

5/6已上傳一個壓縮檔,內有p1-ch11講義,是word檔,選擇答案反白設定顏色即可
       不然P1G及P1C的Ch11參考講義亦同

2016年5月6日 星期五


P1G及P1C的 Ch11參考講義

Word 檔一個, 答案是將字型顏色 改白色,請選取後改其它顏色即可

下載

P1AB資概資料

壓縮檔一個
含5/6在 T:碟中的資料

    下載  

接著要將程式變化題的解題邏輯放上去,來得及就全放,來不及就放三個
變化一:運算結果最大值
  給三個數字 a,b,c ,只有+、* 兩種運算及一個括號,問下列運算式哪一個?最大?
   (a+b)*c、a+(b*c)、(a*b)+c、a*(b+c)
設p表目前最大值的算式編號,v1=算式1的值v2~v4=算式2~算式4的值
v0=v1  , p=1  
 {註v1最大}
若v2>v0 則 p=2, v0=v2  {註v2最大}
若v3>v0 則 p=3, v0=v3  {註v3最大}
若v4>v0 則 p=4, v0=v4  {註v4最大}
依p值知哪一算式最大,且最大值在v0

變化二:糖果紙換糖果
  一顆糖果3元,5張糖果紙可換1顆,又3張糖果紙可換1元,而且如果有4張糖果紙的話可向老闆先借1張換1顆馬上吃再還,請問有 n 元最多可以吃到幾顆糖果?
設n為金額,c為買到的糖果數,p為吃完的糖果紙,  e為已吃了多少顆
1 c=n/3買糖果,剩n%=3元
2 e=c吃了c個,p=c有c張紙
3 若p>=4張可換糖果來吃 p/4顆,剩p%4張
4 若剩3張而且有2元可再吃一顆

變三、變四另補



2016年5月9日 星期一

給 P1A、P1B

我決定抽選的由a001~a007抽1、a008~a014抽1、a015~a021抽1

變化的會由以下所公佈的四個練習題中抽2個(但類似而已)

變化一:運算結果最大值
  給三個數字 a,b,c ,只有+、* 兩種運算及一個括號,問下列運算式哪一個?最大?
   (a+b)*c、a+(b*c)、(a*b)+c、a*(b+c)

變化二:糖果紙換糖果
  一顆糖果3元,5張糖果紙可換1顆,又3張糖果紙可換1元,而且如果有4張糖果紙的話可向老闆先借1張換1顆馬上吃再還,請問有 n 元最多可以吃到幾顆糖果?
 

變化三:費氏數列
 f0=1、f1=1、f2=2、f3=3、f4=5、f5=8、f6=13、...、f20=10946、...、
     f50=20365011074、...、f70=308061521170129、...、f90=4660046610375530309
   輸入 n , 0<=n<=90,請問 fn的值

變化四:判斷可否被11整除
 如果是long long int 可存範圍正整數 n <=2^63-1 = 9223372036854775807{約9.22*10^18}
比照a024所有位數和,但分奇數位的和odd及偶數位的和even,若odd-even可被11整除的話,則 n 也可被11整除。{這樣解題時只要加個if判斷是奇數位就加至odd、偶數位就加至even}

 但如果n的位數超出19位數怎麼辦?假設n不超過30位數,為了可以使用long long整數讀,
我們將n平分為n1及n2兩部份,並且在n1及n2之前加d1、d2代表各幾位數
例如: n為901234567890123456789共有21位數將之分為11位及10位,則輸入 d1  n1  d2  n2
11  90123456789  10 123456789 ,這樣就可以輸入,也可以分別算 n1及n2的奇數位及偶數位
就是給 d1  n1  d2  n2  為11  90123456789  10 123456789 就是問 901234567890123456789
是否可被 11 整除?  {n2的前面有0時不會讀入,所以要判斷d2的位數自己算前導0的位數}

2016年5月7日 星期六

a021~a025說明

a021 我討厭偶數
這題輸入一整數 n ,若偶則一直除2,直到奇數為止
while( n%2==0 ) n/=2;  是偶數就除
cout n    ,不是偶數了才印

a022 細菌繁殖
輸入 n m , n 一直乘3,乘幾次才會>=m

設次數 cnt = 0;  
  while( n < m )   當n<m繼續   
  {  
     ++ cnt ;   次數+1
     n *= 3;    每次乘3
  }  
 cout 次數

a023 3N+1
輸入1個 n , 偶數除2,奇數*3+1,直到1為止,輸入的數及1也算,
含中間變化的數共出現幾個不同的數
設個數 cnt = 1;  輸入的數字算 1 個   
  while( n != 1 )  不是 1 繼續  
  {  
     if( n%2 == 0 ) n/=2;   偶數 除2   
     else n = n*3+1;        奇數 *3+1   
     ++cnt ;       計數+1        
  }  
cout 個數

a024 所有位數和
輸入1個數 n 算出每位數的和,例 12345則和為 1+2+3+4+5 = 15
設和 sum = 0;  
  while( n != 0 ) 每次取個位後除10,直到0為止  
  {  
    sum += ( n%10 );  //取個位數 將之加入和 sum內 
    n /= 10;          // 除10 , 因 n 宣告為整數,小數會捨棄         
  }  
cout sum

a025 數字倒轉
輸入1個數 n ,將其倒著印出,例 12345 印 54321,若1200只印21
類似a024但 sum需每次乘10
設定和 sum = 0;  
  while( n != 0 )  //和每次乘10後,加上原數的個位數
  {                      // 並每次將原數除10
    sum = sum * 10 + ( n%10 );  //取個位數 倒著放     
    n /= 10;          // 除10 , 因 n 宣告為整數,小數會捨棄         
  }  
cout sum

2016年5月6日 星期五