作者chhsiao (bye~)
看板b96902HW
标题Re: [使徒] 使徒..
时间Tue Oct 23 18:05:26 2007
※ 引述《JingXD (@O@)》之铭言:
: 使徒四的第二个测资....
: 为什麽连 用三个FOR 去一一检查 也不对阿 囧囧囧
: WHY WHY WHY ~~~ 囧囧
这是我的 loop 版本:
#include <stdio.h>
int main(){
int N;
int A, B, C, D;
int a, b, c;
int i, j, k;
int sum1, sum2, sum3;
int found;
for(scanf("%d", &N); N > 0; --N){
scanf("%d %d %d %d %d %d %d", &D, &a, &b, &c, &A, &B, &C);
found = 0;
for(i = 0, sum1 = 0; !found && i <= a &&
sum1 >= 0 && sum1 <= D; ++i, sum1 += A)
for(j = 0, sum2 = sum1; !found && j <= b &&
sum2 >= 0 && sum2 <= D; ++j, sum2 += B)
for(k = 0, sum3 = sum2; !found && k <= c &&
sum3 >= 0 && sum3 <= D; ++k, sum3 += C)
if(sum3 == D)
found = 1;
printf(found ? "yes\n" : "no\n");
}
return 0;
}
其中 sum1 代表用到的 alligator legs 的魔力总和,
sum2 代表用到的 alligator legs 及 bat eyes 的魔力总和,
sum3 代表用到的 alligator legs, bat eyes 及 cat skulls 的魔力总和.
我来说一下什麽是 "溢位" 好了:
因为 int 只有 32 bits 可以用, 所以只能表示 -2^31 ~ 2^31 - 1,
也就是 -2147483648 ~ 2147483647.
当两个
正数相加的结果超过 2147483647 後,
就发生所谓的 "溢位", 这时多出来的那 1 个 bit 会被丢掉,
剩下来的 bits 在电脑解读起来会变成负数 (注意只有
两个正数相加才会这样),
可以想像成下图:
|-------------------------------o
----------------------*--------|
-2^31 A 2^31-1
|-------------------------------o
-------------------------*-----|
-2^31 B 2^31-1
|---------------*---------------o
-------------------------------|
-2^31 A+B 2^31-1
因此, 我用 sumX >= 0 来克服 overflow 的问题.
因为 D <= 2147483647, 因此 sumX 加到 overflow 的话,
就一定超过 D 了.
---
这是不好的示范, 大家不要学 XD
--
>_<
U
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.54
1F:推 hikaru4:看的很吃力 有个小问题 sum123难道不会溢位溢到变正的吗? 10/23 20:08
2F:→ hikaru4:还是我还没真正看懂? 10/23 20:10
3F:→ hikaru4:噗....好像看懂了 是相加的不会溢到变正? 是这样吗? 10/23 20:11
4F:推 chhsiao:是两个介於 0 - 2^31-1 的正数相加喔! 10/23 21:08