變化三:費氏數列
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的值,若費氏計算機只顯示最右8位數,小於8位靠右顯示,
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的值,若費氏計算機只顯示最右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切成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
如果是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的位數}
假設有一 22位數
n=7,251,000,000,000,000,000,218分成 左8位、右14位,
則輸入d1, n1
, d2, n2 就是 8 72510000 14 218
宣告兩個變數odd、even分別設為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 意見:
張貼留言