永发信息网

杭电ACM HDU 1207 汉诺塔 当我使用int __int64的时候都是WA,使用double就AC了。

答案:2  悬赏:70  手机版
解决时间 2021-04-01 22:00
杭电ACM HDU 1207 汉诺塔 当我使用int __int64的时候都是WA,使用double就AC了。
最佳答案
#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,可以做一些简单处理,比如我上面给你改的代码
全部回答
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]) ;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
奥马bcd-300wf 300升 风冷无霜 电脑控温 多门
怎分升和降压变压器?
我身边的诚信故事作文9万亿字
大家听说过Hotshapers爆汗裤吗? 听说做家务也
假舟楫者 非能水也 而绝江河是判断句吗?
《永远的7日之都》建筑有什么用 建筑用途介绍
小额 异地跨行转账 周六日 受理吗?如果受理
异常详细信息: System.Data.SqlClient.SqlExc
短文山茶花里的排比句是哪句
腹卧撑跟深蹲和仰卧起坐怎样配合练习?一天多
河北实施3年“春雨工程”取得哪些成果?
returnest 这个词来自一篇英语散文,为什么查
鸭肫,鸭肠在苏州哪里有买,
宁波健身房有哪些
列车t41次卧铺是几层
推荐资讯
“ithinkthecakewasmoredeliciousthananythin
如果开车撞到人驾驶员在车内会有感觉吗
CAXA电子图版2011能在X或Y单方向对图形进行缩
用深刻造句
取名大全女孩姓钟带个微字
女孩子喜欢上了遗体美容师工作,需去哪学习呢
如何准备初级会计师
鄂旗公卡汉中学地址在什么地方,我要处理点事
生活类谚语
水钻孔桩属于人工挖空灌注桩还是搅拌水泥土桩
东北的朋友回答一下~三月中旬到长白山旅游气
AICPA考试教材选择
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?