2017-08-24 853 views
1

在C++int(%d)和%.0lf有什麼不同?

int a, b, c; 
double k; 

scanf("%d %d %d", &a, &b, &c); 
k = (double)a*a/(b*b + c*c); 
printf("%.0lf %0.lf %d", sqrt(b*b*k), sqrt(c*c*k), (int)sqrt(c*c*k); 

例如, 輸入:52 9 16 輸出:25 45 45

但是,我認爲那些是不同的。其實,在網上裁判中判斷不一樣。

有什麼不同?

printf("%.0lf %0.lf %d", sqrt(b*b*k), sqrt(c*c*k), (int)sqrt(c*c*k); 

在上面的句子裏,L,而不是1

它是根據不同的編譯器?

+0

這取決於編譯器並沒有不同。這應該是什麼:'%.0lf' – tilz0R

+0

但是,在線Judge中,當我編寫%.0lf, 時,我得到了「錯誤」,但是當我使用(int)sqrt寫入%d時,我得到了「正確」 (bla); – StackQ

+3

我再次問你,用'%.0lf'指望什麼?'0'是什麼? – tilz0R

回答

-1

這兩件事

  • %d十進制(簽名)整數
  • %lf長浮現在稱爲精度浮點數和
    • %.0lf裝置一個雙數與零數字在小數點後面所以它基本上和一個整數相同。不過,有一個小小的差異,當轉換爲int時,小數點後的數字會直接丟棄,而轉換爲%.0lf時,會舍入爲最接近的整數。

所以預期輸出是完全一樣的。我不知道你爲什麼期待不同的輸出。

+1

它是C/C++,當傳遞給'printf()'時,float不會被自動強制爲一個整數。浮點和整數具有不同的位表示。你的回答是不正確的 –

+0

@NiklasR但是PRINTF會在decm點之後去掉所有的東西! – iBug

+0

我認爲Niklas指出你需要將'int'傳遞給'%d'格式,而不是'double'。 OP的代碼實際上是在執行該操作,所以輸出應該是相同的。 – Useless

0

printf("%d", (int)sqrt(...))轉換爲整數將數字截斷爲整數,因此2.9變爲2 - 並且%d打印該數字。

printf("%0.lf", sqrt(...))浮點數四捨五入爲零十進制數字,所以2.9如果答案是不是整數的結果可能會有所不同寫成3

這樣。

+0

double db; \t db = 19/10; printf(「%d%.0lf%0.lf」,int(db),db,db); 但是,結果是1 1 1 – StackQ

+0

嘗試db = 19.0/10.0; –

相關問題