在上个月的挑战中,我必须避免造成溢出错误可能导致额外复杂情况的情况。 事实上,基于 Miller-Rabin 的模幂算法是素数编写例程是为了避免这个问题。 无论使用何种编程语言,您都不可避免地会遇到此问题。
当您尝试执行所需位数多于可用于表示结果的位数的操作时,就会发生溢出错误。 在处理大整数时,这种情况经常(但并非唯一)发生。 例如,尝试以下示例:
//Example 1
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x+i));
x = 9007199254740992;
For(i=1,i<=10,i++,Print(x-i));
//Example 2
n1 = 9007199254740999;
n2 = 1;
Print(n1-n2);
2 53是最大的整数联合管理计划可以代表溢出发生之前。 这是浮点表示的一个很好的解释(JMP 中的所有数字均为浮点数)。 对于本月的挑战,我希望看到您想出一些加法和减法的方法,这些方法会溢出 JMP 的整数表示形式。 创建两个函数
- 减大( n1 , n2 ) 在哪里n1和n2都是文本形式的整数(正数、负数或 0)。 返回文本形式的值。
- 加大( n1 ,< n2 >) 哪里
n1 – 文本形式的整数,或者,如果n2为空,文本形式的整数列表(正数、负数或 0)。
n2 – 文本形式的整数
返回文本形式的值。
例子
减大(“9007199254740999”,“9007199254740998”)返回“1”
加大(“9007199254740992”,“7”)返回“9007199254740999”
加大({“9007199254740999”,”-1”,”11”}) 返回“9007199254741009”
评分
- 一个版本5分加大它可以 1) 在 30 秒内将两个最多 1000 位数字相加,以及 2) 在 30 秒内找到最多包含 100、100 位数字的列表的总和。 第 1) 部分将使用 10 组不同的数字进行测试。 每个数字中的位数不一定相同。 所有提交的内容都将使用同一套 10 个。
- 额外加分3分减大,它必须在 30 秒内计算 (x – y),其中 x 和 y 是最多 1000 位数字。 将使用十组不同的数字。 每个数字的位数不一定相同。 所有提交的内容都将使用同一套 10 个。
- 3 奖励积分加大能正确添加最大(位数)的提交n1和n2相同长度,5 秒内完成。 (2分2分ND , 1 代表 3 RD )
- 3 奖励积分加大提交能够在 5 秒内正确添加最多 1000 位数字的作品(2 分 2 分) ND , 3 分 1 分RD )。
- 如果提交的速度与 JMP 工作人员提交的速度相同或更快,则每项加分 3 分。
提交截止日期为美国东部时间 6 月 15 日星期一晚上 11:59。 祝你好运!
这可能值得澄清,因为这有点令人困惑。 两个函数(并且两种情况都为加大)应该能够处理不同长度和符号的数字。 我会测试一下。 在确定奖励速度和大小点时,我将使用相同长度的数字。
大学教师
我昨晚又读了一遍你的挑战描述,我认为你对要求的解释很清楚。请随意忽略我的询问。对于那个很抱歉!
-戴夫
回应我的询问 - 我刚刚读过你的第三个例子 - 这表明(我)我们不能假设 n1 列表中的所有数字都具有相同的位数。还, (二) n1 列表可能包含负数。想必那时(三)对于两个数字 n1 和 n2 的情况,其中一个或两个可能为负数?
也许你可以澄清我提到的三点。 谢谢。
对于我们添加数字列表的情况,我们是否可以假设每个数字的长度相同,或者这是我们需要测试的东西? (即我们需要处理一般情况还是只处理您描述的测试场景?)