作者frsnic (路人)
看板C_and_CPP
標題[問題] pow奇怪的情況...
時間Sun May 10 12:25:43 2009
就是我用不一樣的括號做pow會得到wa跟ac = =
原始題目
http://zerojudge.tw/ShowProblem?problemid=d213
WA (當輸入是53的時候 會wa)
與正確輸出不相符(line:54)
您的答案為: 35993612646875138
正確答案為: 35993612646875136
(我只能說非常邪門 我在windows跟fedora上跑都是正確答案 丟到zerojudge上就錯了...)
#include<stdio.h>
#include<math.h>
int main(void)
{
unsigned long long int n, k;
while(scanf("%llu\n" , &k) != EOF)
{
n = (pow(2, (k + 1)) - 1) * 2;
if(k >= 10)
{
n = n - ((pow(2, (k - 9)) - 1) * 2);
}
printf("%llu\n" , n);
}
return 0;
}
-------------------------------
AC
#include<stdio.h>
#include<math.h>
int main(void)
{
unsigned long long int n, k;
while(scanf("%llu\n" , &k) != EOF)
{
n = (pow(2, (k + 1)) - 1) * 2;
if(k >= 10)
{
k = pow(2, (k - 9));
n = n - ((k - 1) * 2);
}
printf("%llu\n" , n);
}
return 0;
}
--
你讓我清楚的看見 星星在夜裡的善變
戀人們臉上的終點 寫滿了欺騙 編織了永遠也辜負了永遠
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.111.76.71
※ 編輯: frsnic 來自: 140.111.76.71 (05/10 12:26)
推 AppleFox:我之前也是碰到類似這樣的問題 可以也是不知道為什麼=.=' 05/10 12:33
→ frsnic:詭異... 05/10 12:36
推 jtmh:因為 pow 計算出的值是 double 吧。前者是接者繼續算,最後才 05/10 12:49
→ jtmh:存入 long long; 後者是先存入 long long, 然後繼續算。猜的! 05/10 12:50
→ TroyLee:參數也要帶double 05/10 13:00
推 Fenikso:需要高精確度的時候不要用double 會AC只是運氣好 05/10 13:05
推 chrisdar:樓上這情況下要用什麼? __int64 ? 05/10 13:11
推 Fenikso:就long long啊..@_@ 05/10 13:13
→ frsnic:但是要算次方 不就要用pow 但是pow就是用double阿... 05/10 13:36
→ frsnic:還是有其他的方法 難不成要自己算? 05/10 13:37
推 chrisdar:你得到它了 05/10 13:38
→ chrisdar:為了有效利用整數運算器的效能 自己重寫整數次方吧 05/10 13:39
推 TroyLee:整數次方自己寫就好摟.. 05/10 14:13
→ frsnic:原來如此... 05/11 01:04