- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我今天在面试开发人员工作时遇到了以下情况,这是问题之一,也是我唯一没有回答的问题。
将N个数串联N次,然后计算出他到2017年的模数。
例如:对于 N=5,数字将为 55555,结果将为 Mod(55555,2017) = 1096 对于 N=10,数字将为 10101010101010101010,结果 Mod(10101010101010101010,2017) = 1197
现在我必须计算的数字是 58184241583791680。我得到的唯一提示是 58184241583791680 连接 58184241583791680 乘以 2017 的模数的结果是一个 4 位数。
我发布了 this question在 math.stackexchange 上,我得到了解决这个问题的数学方法,而不是蛮力。
我用JAVA写了下面的代码
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
public class Puzzle {
final static BigInteger M = new BigInteger("2017");
public static void main(String [ ] args) {
for (long n : new long[] { 1L, 2L, 5L, 10L, 20L }) {
System.out.println(n + " --> " + bruteForce(n) + " --- " + formulaV2(n));
}
}
private static BigInteger bruteForce(long n) {
String s = "";
for (long i = 0; i < n; i++) {
s = s + n;
}
return new BigInteger(s.toString()).mod(M);
}
private static BigInteger formulaV2(long n) {
String aux = String.valueOf(n);
long L = aux.length();
long K = n;
double op1 = Math.pow(10,L*K);
BigDecimal minus1 = new BigDecimal(1);
BigDecimal p1 = new BigDecimal(op1).subtract(minus1);
double op2 = Math.pow(10,L);
BigDecimal p2 = new BigDecimal(op2).subtract(minus1).pow(-1,MathContext.DECIMAL64);
BigDecimal R = new BigDecimal(n).multiply(p1).multiply(p2);
R = R.setScale(0,BigDecimal.ROUND_UP);
BigInteger ret = R.toBigInteger();
return ret.mod(M);
}
}
我正在使用 BigInteger 和 BigDecimal,因为我想获得非常大的数字(16 位以上)的值。
bruteForce 方法将简单地连接循环内的数字,而 formulaV2 方法将使用数学论坛中提出的问题中的公式。
bruteForce 方法仅用于验证。
然而,公式方法适用于 N<10 但不适用于 N>=10。在 N=10 时,我得到了不正确的结果。
编码似乎与提供的公式一致(至少对我来说,也许我遗漏了什么),并且公式是正确的(我在 Wolfram Alpha 中检查过)。
我的猜测是我有精度问题,也许 BigDecimal 在这种情况下不是合适的对象?
最佳答案
使用数学!一个好的面试官希望您使用您的大脑并解决问题,而不是用糟糕的代码蛮力解决问题。
在这种情况下,他可能希望你使用等号
ab mod n = [(a mod n)(b mod n)] mod n
(a + b) mod n = [(a mod n) + (b mod n)] mod n
以及例如将一个四位数字串联三次与 xyzu * 100010001
相同,后者可以进一步分解为 10000^0+10000^1+10000^2
.
现在在你的例子中,基数 x 和重复次数 y 是相同的,而且都相当大。但模数 n 很小。设 D 是比 x 大的 10 的下一个幂。
因此 D mod n 实际上不是 D,而是小于 2017。您实际上可以计算 ((D mod n)^y) mod n 而不是计算 D^y,如果您在 for 中执行此操作循环它最终将(最多 2017 步之后)循环 或变为 0。因此,您最多可以在 2017 次迭代中计算该术语。因此,这种智能方法的复杂度为 O(n),其中 n 是模项,而朴素方法将需要 O(x*y) 内存。
有了这些技巧,您应该能够在不 BigInteger 的情况下执行此操作,而且速度更快。
关于java - N 数串接 N 次的模数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068283/
我看到以下宏 here . static const char LogTable256[256] = { #define LT(n) n, n, n, n, n, n, n, n, n, n, n,
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
所以我得到了这个算法我需要计算它的时间复杂度 这样的 for i=1 to n do k=i while (k<=n) do FLIP(A[k]) k
n 的 n 次方(即 n^n)是多项式吗? T(n) = 2T(n/2) + n^n 可以用master方法求解吗? 最佳答案 它不仅不是多项式,而且比阶乘还差。 O(n^n) 支配 O(n!)。同样
我正在研究一种算法,它可以在带有变音符号的字符(tilde、circumflex、caret、umlaut、caron)及其“简单”字符之间进行映射。 例如: ń ǹ ň ñ ṅ ņ ṇ
嗯..我从昨天开始学习APL。我正在观看 YouTube 视频,从基础开始学习各种符号,我正在使用 NARS2000。 我想要的是打印斐波那契数列。我知道有好几种代码,但是因为我没有研究过高深的东西,
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭12 年前。 Improve th
谁能帮我从 N * N * N → N 中找到一个双射数学函数,它接受三个参数 x、y 和 z 并返回数字 n? 我想知道函数 f 及其反函数 f',如果我有 n,我将能够通过应用 f'(n) 来
场景: 用户可以在字符串格式的方程式中输入任意数量的括号对。但是,我需要检查以确保所有括号 ( 或 ) 都有一个相邻的乘数符号 *。因此 3( 应该是 3*( 和 )3 应该是 )*3。 我需要将所有
在 Java 中,表达式: n+++n 似乎评估为等同于: n++ + n 尽管 +n 是一个有效的一元运算符,其优先级高于 n + n 中的算术 + 运算符。因此编译器似乎假设运算符不能是一元运算符
当我阅读 this 问题我记得有人曾经告诉我(很多年前),从汇编程序的角度来看,这两个操作非常不同: n = 0; n = n - n; 这是真的吗?如果是,为什么会这样? 编辑: 正如一些回复所指出
我正在尝试在reveal.js 中加载外部markdown 文件,该文件已编写为遵守数据分隔符语法: You can write your content as a separate file and
我试图弄清楚如何使用 Javascript 生成一个随机 11 个字符串,该字符串需要特定的字母/数字序列,以及位置。 ----------------------------------------
我最近偶然发现了一个资源,其中 2T(n/2) + n/log n 类型 的递归被 MM 宣布为无法解决。 直到今天,当另一种资源被证明是矛盾的(在某种意义上)时,我才接受它作为引理。 根据资源(下面
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我完成的一个代码遵循这个模式: for (i = 0; i < N; i++){ // O(N) //do some processing... } sort(array, array + N
有没有办法证明 f(n) + g(n) = theta(n^2) 还是不可能?假设 f(n) = theta(n^2) & g(n) = O(n^2) 我尝试了以下方法:f(n) = O(n^2) &
所以我目前正在尝试计算我拥有的一些数据的 Pearson R 和 p 值。这是通过以下代码完成的: import numpy as np from scipy.stats import pearson
ltree 列的默认排序为文本。示例:我的表 id、parentid 和 wbs 中有 3 列。 ltree 列 - wbs 将 1.1.12, 1.1.1, 1.1.2 存储在不同的行中。按 wbs
我的目标是编写一个程序来计算在 python 中表示数字所需的位数,如果我选择 number = -1 或任何负数,程序不会终止,这是我的代码: number = -1 cnt = 0 while(n
我是一名优秀的程序员,十分优秀!