【发布时间】:2017-12-29 18:10:11
【问题描述】:
给定 N 和 M,使用左移运算符编写一个方程 结果将等于乘积 N * M。
输入:第一行有 0 T ≤ 50000 表示测试用例的数量。
接下来 T 行有两个整数 0 N, M ≤ 10¹⁶。输出:为每个测试用例打印一个等式 N * M 类似
(N 其中 p1 ≥ p2 ≥ ... ≥ pk k 是最小值。
SAMPLE INPUT SAMPLE OUTPUT 2 2 1 (2<<0) 2 3 (2<<1) + (2<<0)时间限制:1.0 秒
我的解决方案第一种方法
int dig = (int)(Math.floor(Math.log10(m)/Math.log10(2))+1);
boolean flag = false;
for(long i = dig; i>=0; --i) {
if(((m>>(i-1l)) & 1l) == 1l) {
if(flag)
System.out.print(" + ("+n+ "<<"+(i-1)+")");
else {
System.out.print("("+n+"<<"+(i-1)+")");
flag = true;
}
}
}
第二种方法
boolean[] arr = new boolean[dig];
int i = dig-1;
while(m > 0) {
if((m&1) == 1 ) {
arr[i] = true;
}
i--;
m = m>>1l;
}
int j = dig-1;
for( i = 0; i < dig; ++i) {
if(arr[i]) {
if(flag)
System.out.print(" + ("+n+"<<"+j+")");
else {
System.out.print("("+n+"<<"+j+")");
flag = true;
}
}
j--;
}
在这两种情况下,我都得到了 8 个正确的 5 个,其余 3 个是 TLE,为什么?
【问题讨论】:
-
«TLE»是什么意思?
-
已超过时间限制。每个查询的接受时间为 1.0 秒
-
如果是(使用左移运算符,写)(一个方程),它似乎使用的是
m>>,而不是<<。如果没有 any 指示m是,我们如何知道m>>是否没有扩展ms 符号,m永远不会达到 0Second Approach?也就是说,我不知道为什么第一个应该 TLE - 第二个应该得到 IOOBE。我没有看到你的 sn-ps 输出 lines。我确实看到很多“字符串添加”的参数在迭代之间没有改变。 -
@greybeard IOOBE?这是否意味着IndexOutOfBoundsException?现在可以做些什么来改进它?我不完全明白你想说什么。 “m”是我们除以 n 的数。例如 2 * 3,然后 n = 2 和 m = 3。所以我将其分解为二进制的 3 = 11。我必须将 2 位移 1,然后将其添加到位移 2 中。如果它是 m = 2,那么我不会将 2 位移添加 0。
标签: java bit-manipulation bit-shift multiplication