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整除


0 意見:

張貼留言