這題我不會做,參考的大神的思路
傳送門浮點數在計算機裡是分三部分表示的
最前面一位表示符號,後面一部分是尾數,最後一部分是階碼
尾數是m,階碼是e的話表示起來就是:
m×用二進位制表示m的話就應該是0.1xx……,(用計算機表示的時候就把最前面的「0.1」給省略掉,只表示可能變化的部分。)階碼部分則是只用二進位制表示e。例如:2e(1
2≤m<1)
。
前面的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為其對應的尾數和階,即為
m×那麼根據前面的例子我們能得出m,e和m,e的關係:2e(1
2≤m<1)
m=這樣對我們遍歷的每乙個m和e,m和e就求出來了然後我們要通過m和e求出aeb中的a的b(對應著輸入格式),即1−2−
(m+1
) e=
2e−1
m×這個時候直接算肯定是不可行的,因為e本身的值就是2的指數(最大1073741823),而它又要作為2的指數我就是做到這裡卡住了,看了大神的部落格恍然大悟,只要取個對數就可以了,這是整個題目的關鍵,取完對數之後(對10取對數):2e=a
×10b
lo由於m,e是已知的,所以左邊是已知的,不妨設為t,最後我們得到g10m+
e∗lo
g102=
log10
a+b
t=由前面a的範圍我們知道 lolog10
a+b
g10a<
1 那麼b就是t的整數部分,a就是t的小數部分了,即
b=至此便求出a和b了(int
)ta=10
t−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 分鐘後再次檢查這個...