作者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)
1F:推 AppleFox:我之前也是碰到类似这样的问题 可以也是不知道为什麽=.=' 05/10 12:33
2F:→ frsnic:诡异... 05/10 12:36
3F:推 jtmh:因为 pow 计算出的值是 double 吧。前者是接者继续算,最後才 05/10 12:49
4F:→ jtmh:存入 long long; 後者是先存入 long long, 然後继续算。猜的! 05/10 12:50
5F:→ TroyLee:参数也要带double 05/10 13:00
6F:推 Fenikso:需要高精确度的时候不要用double 会AC只是运气好 05/10 13:05
7F:推 chrisdar:楼上这情况下要用什麽? __int64 ? 05/10 13:11
8F:推 Fenikso:就long long啊..@_@ 05/10 13:13
9F:→ frsnic:但是要算次方 不就要用pow 但是pow就是用double阿... 05/10 13:36
10F:→ frsnic:还是有其他的方法 难不成要自己算? 05/10 13:37
11F:推 chrisdar:你得到它了 05/10 13:38
12F:→ chrisdar:为了有效利用整数运算器的效能 自己重写整数次方吧 05/10 13:39
13F:推 TroyLee:整数次方自己写就好搂.. 05/10 14:13
14F:→ frsnic:原来如此... 05/11 01:04