2015-06-02 51 views
2

的Codility问题和测试用例示于:here为什么代码在Codility测试用例中返回负值?

写入golang的代码:

func Solution(A []int, B []int) []int { 
    result := make([]int, len(A)) 
    step := make([]int, len(A)+1) 
    step[0] = 1 
    step[1] = 1 
    for i := 2; i <= len(A); i++ { 
     step[i] = step[i-1] + step[i-2] 
    } 
    for i := 0; i < len(A); i++ { 
     result[i] = int(int32(step[A[i]]) % int32(math.Pow(2, float64(B[i])))) 
     // result[i] = step[A[i]] & (1<<uint(B[i]) - 1) 
    } 
    return result 
} 

result[i] = step[A[i]] & (1<<uint(B[i]) - 1)通过了所有病例。但result[i] = int(int32(step[A[i]]) % int32(math.Pow(2, float64(B[i]))))result[i] = step[A[i]] % int(math.Pow(2, float64(B[i])))产生一些负数。

看起来有些东西溢出。有人会知道原因吗?谢谢!

+0

您是否使用了与您提供的链接中给定的A和B完全相同的数组?如果A和B都由小的正整数组成,我看不到结果为负的任何理由。 –

+0

示例数组结果OK。但是在提交代码后,它在某些情况下失败了。不幸的是,codilty并没有显示完全的测试用例,所以我不知道在这种情况下使用的数组。奇怪! – victor1ee

回答

0

对于某些输入,您将范围为[1<<31, 1<<32)的值转换为int32

http://play.golang.org/p/6HYPXY9Kjb

a := int64(1 << 31) 
b := int64(1<<32 - 1) 
// int32(a) == -2147483648 
// int32(b) == -1 

根据您的算法是如何工作的,你需要扩大范围使用int64,或使用uint32,这将截断的价值,但仍然乐观。

+0

它使感觉!编码问题假设“数组B的每个元素都是[1..30]范围内的整数”,也许某些测试用例的输入超出了该限制。 – victor1ee

相关问题