【问题标题】:Test cases for algorithm puzzle算法难题的测试用例
【发布时间】:2012-05-20 12:57:25
【问题描述】:

以下是来自Interviewstreet 的问题,有人可以给我一些测试用例以及输出。我的解决方案在所有测试用例的时限内,但给出了错误的答案。

圆求和(30 分)

N的孩子围成一圈,顺时针编号为1,2,...,Nith 孩子有一张纸,上面写着ai。他们玩以下游戏:

在第一轮中,编号为x 的孩子将他的邻居的数量之和添加到他的号码中。

在第二轮中,顺时针顺序的下一个孩子将他的邻居的数字之和加到他的数字上,以此类推。

游戏在M 回合结束后结束。

输入: 第一行包含T,即测试用例的数量。 T 案例如下。测试用例的第一行包含两个空格分隔的整数NM。下一行包含N 整数,ith 数字为ai

输出: 对于每个测试用例,输出 N 行,每行有 N 个整数。 ith 行上的 jth 整数包含第 j 个孩子结束的数字,如果游戏以孩子 i 进行第一轮比赛开始。在除最后一个之外的每个测试用例之后输出一个空行。由于数字可能非常大,因此以 1000000007 为模输出。

约束:

1 <= T <= 15
3 <= N <= 50
1 <= M <= 10^9
1 <= ai <= 10^9

示例输入:

2
5 1
10 20 30 40 50
3 4
1 2 1

样本输出:

80 20 30 40 50
10 60 30 40 50
10 20 90 40 50
10 20 30 120 50
10 20 30 40 100



23 7 12
11 21 6
7 13 24 

【问题讨论】:

    标签: algorithm testing testcase


    【解决方案1】:

    如果对于小型测试用例似乎没问题,但不是全部,我猜你有溢出问题。

    请确保您...

    • 在每次相加后计算模数,而不仅仅是在三个数字相加之后。
    • 使用 64 位数字。这仍然需要模数,但不那么频繁。

    1000000007 非常接近有符号 32 位数字 (214748367) 的限制。您可以添加调制数字而不会溢出,但不能添加三个。

    【讨论】:

    • 你假设 ai=10^9 和 m=10^9 并且 n 太小,这意味着最终 ai 大约是 10^18。并且 64 位数字就足够了,因为 64 位符号数字等于 2^63=8*(2^10)^6=8*10^18
    • 最大可能求和:1000000006 + 1000000006 + 1000000006 = 3000000018 > 2147483647 = 2^31 - 1(带符号的 32 位数字的最大值),这意味着它将环绕到 -129496727如果你改为 ((1000000006 + 1000000006) % 1000000007 + 1000000006) % 1000000007,你就不会有这个问题了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多