杭电ACM HDU 1207 汉诺塔 当我使用int __int64的时候都是WA,使用double就AC了。
答案:2 悬赏:70 手机版
解决时间 2021-04-01 22:00
- 提问者网友:十年饮冰
- 2021-04-01 05:29
杭电ACM HDU 1207 汉诺塔 当我使用int __int64的时候都是WA,使用double就AC了。
最佳答案
- 五星知识达人网友:逃夭
- 2021-04-01 05:37
#include
#include
int main(void)
{
int i, j, n;
__int64 min, temp;
__int64 a3[65] = {0, 1};
__int64 a4[65] = {0, 1};
for(i = 2; i < 64; i++){
a3[i] = 2*a3[i-1] + 1;
}
a3[i]=a3[i-1]-1+a3[i-1]; //比实际小2,主要是为了防止越界,此外因为这么大后面肯定不会选这个策略,所以不影响结果准确性
for(i = 2; i < 65; i++){
min = -1;
for(j = 1; j < i; j++){
temp = 2*a4[j] + a3[i-j];
if(temp < 0)continue; //都越界了的话肯定不小,不能作为结果
if(temp < min || min == -1)
min = temp;
}
a4[i] = min;
}
while (scanf("%d", &n) != EOF)
printf("%I64d\n", a4[n]);
return 0;
}
-----------------------
确实要注意越界问题,htqxtc分析的正确
a3[i] = 2*a3[i-1] + 1;
temp = 2*a4[j] + a3[i-j];
都可能会越界,如果越界了就成为负数了,显然结果就错了
double的表示范围巨大,所以在精度没有影响结果的情况下就正确了
如果你用__int64,可以做一些简单处理,比如我上面给你改的代码
#include
int main(void)
{
int i, j, n;
__int64 min, temp;
__int64 a3[65] = {0, 1};
__int64 a4[65] = {0, 1};
for(i = 2; i < 64; i++){
a3[i] = 2*a3[i-1] + 1;
}
a3[i]=a3[i-1]-1+a3[i-1]; //比实际小2,主要是为了防止越界,此外因为这么大后面肯定不会选这个策略,所以不影响结果准确性
for(i = 2; i < 65; i++){
min = -1;
for(j = 1; j < i; j++){
temp = 2*a4[j] + a3[i-j];
if(temp < 0)continue; //都越界了的话肯定不小,不能作为结果
if(temp < min || min == -1)
min = temp;
}
a4[i] = min;
}
while (scanf("%d", &n) != EOF)
printf("%I64d\n", a4[n]);
return 0;
}
-----------------------
确实要注意越界问题,htqxtc分析的正确
a3[i] = 2*a3[i-1] + 1;
temp = 2*a4[j] + a3[i-j];
都可能会越界,如果越界了就成为负数了,显然结果就错了
double的表示范围巨大,所以在精度没有影响结果的情况下就正确了
如果你用__int64,可以做一些简单处理,比如我上面给你改的代码
全部回答
- 1楼网友:北方的南先生
- 2021-04-01 06:53
for(i = 2; i < 65; i++){
a3[i] = 2*a3[i-1] + 1;
}这里初始化的时候,很明显后面的数会超过int大小,你可以加一句printf看看
for(i = 2; i < 65; i++){
a3[i] = 2*a3[i-1] + 1;
printf("%.0lf\n",a3[i]) ;
}
a3[i] = 2*a3[i-1] + 1;
}这里初始化的时候,很明显后面的数会超过int大小,你可以加一句printf看看
for(i = 2; i < 65; i++){
a3[i] = 2*a3[i-1] + 1;
printf("%.0lf\n",a3[i]) ;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯