算典03 習題 12

2021-07-27 04:56:21 字數 2407 閱讀 8725

這題我不會做,參考的大神的思路

傳送門浮點數在計算機裡是分三部分表示的

最前面一位表示符號,後面一部分是尾數,最後一部分是階碼

尾數是m,階碼是e的話表示起來就是:

2e(1

2≤m<1)

用二進位制表示m的話就應該是0.1xx……,(用計算機表示的時候就把最前面的「0.1」給省略掉,只表示可能變化的部分。)階碼部分則是只用二進位制表示e。例如:

前面的0表示是正數。後面8位表示尾數m,這裡是0.111111111(注意後面是9個1,因為頭乙個省略了)。

之後那個0表示分割

最後面6位表示e的二進位制為111111。

所以這個數就是

0.1111111112∗

2111111

2

用十進位制表示就是

0.998046875∗2

63=9205357638345293824

10

在計算機中用二進位制表示m和e的時候如果位數不同,那麼它們所能表示的最大值也不同。現在給你所能夠表示的最大的浮點數的值,讓你倒回去求m和e分別有多少位。輸入格式為aeb,表示最大浮點數為,並且0 < a < 10,並且保證輸出的結果中0 ≤ m ≤ 9且1 ≤ e ≤ 30。輸入以0e0表示結束,0e0本身不計算。(這裡的m,e表示位數)可以看出,在本題中如果將乙個十進位制轉換成二進位制的話,那是極其不容易的,但是如果將乙個二進位制轉成十進位制,那還是可以嘗試一下的另一方面來說,m和e的範圍都很小,而且都是整數,那麼自然就想到打表了,我們不妨列舉所有的m和e,將其對應的最大值記錄下來因為這裡m和e為位數,我們不妨設m和e為其對應的尾數和階,即為

2e(1

2≤m<1)

那麼根據前面的例子我們能得出m,e和m,e的關係:

m=

1−2−

(m+1

) e=

2e−1

這樣對我們遍歷的每乙個m和e,m和e就求出來了然後我們要通過m和e求出aeb中的a的b(對應著輸入格式),即

2e=a

×10b

這個時候直接算肯定是不可行的,因為e本身的值就是2的指數(最大1073741823),而它又要作為2的指數我就是做到這裡卡住了,看了大神的部落格恍然大悟,只要取個對數就可以了,這是整個題目的關鍵,取完對數之後(對10取對數):

lo

g10m+

e∗lo

g102=

log10

a+b

由於m,e是已知的,所以左邊是已知的,不妨設為t,最後我們得到

t=

log10

a+b

由前面a的範圍我們知道 lo

g10a<

1 那麼b就是t的整數部分,a就是t的小數部分了,即

b=

(int

)ta=10

t−b

至此便求出a和b了

#include 

#include

#include

#include

using

namespace

std;

int main()

string in;

while(cin >> in && in != "0e0") }}

}

算典03 習題 06

有一張圖上,有黑塊和白塊,白塊上有字母 從上到下每一行,從左到右,給符合條件的白塊依次編號,條件是 此白塊的左邊或上邊是邊界或黑塊 要求找到每一行的單詞 按上面編好的號排序 和每一列的單詞輸出,單詞即為最大連續的白塊 只要單純地模擬即可,注意最後的輸出要按編號排序,且編號要右對齊,這裡編號不會超過1...

算典03 習題 07

給出一組dna序列 即一些字串 找出與每個dna序列的差最小的dna序列 差的意思是序列中位置相同但字元不同的位置的個數 輸出這個dna序列以及最小的差 1.準備 這裡有乙個小技巧,dna只有 atcg 四種,要統計這四種出現的次數,就需要一種對應關係,如讓atcg分別對應0123,那麼我就可能用a...

算典04 習題 08

課堂上有n個學生 n 10 每個學生都有乙個 睡眠 清醒 週期,其中第i個學生醒ai 分鐘後睡bi 分鐘,然後重複 1 ai bi 5 初始時第i個學生處在他的週期的第ci 分鐘。每個學生在臨睡前會察看全班睡覺人數是否嚴格大於清醒人數,只有這個條件滿足時才睡覺,否則就堅持聽課ai 分鐘後再次檢查這個...