繁体   English   中英

使用赋予TLE的按位移位运算符相乘

[英]Multiplying Using Bitwise Shift Operators Giving TLE

给定NM ,使用左移位运算符编写一个方程,其结果将等于乘积N * M。

输入:第一线具有0 <T≤50000表示的测试案例数量。
接下来的T行具有两个整数0 < N, M≤10 10。

输出:为每个测试用例打印一个类似N * M的方程式

(N << p1)+(N << p2)+ ... +(N << pk)其中p1≥p2≥...≥pkk最小。

 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为什么?

在这两种方法中,我实际上都看不到任何东西能阻止一万个乘积高达57位的数字在一秒钟内表示为String
TLE 可能是由于System.out.print()花费了过多的时间。
也就是说,使用类似

   /** builds <code>n * m</code> in the form
    * <code>(n&lt;&lt;p1) + (n&lt;&lt;p2) + ... + (n&lt;&lt;pk)</code>
    * using left shift.
    * @param n  (0 < multiplicand <= 10**16)
    * @param m  0 < multiplier <= 10**16
    * @return a verbose <code>String</code> for <code>n * m</code>
    */
    static String verboseBinaryProduct(Object n, long m) {
        int shift = Long.SIZE - Long.numberOfLeadingZeros(m) - 1;
        final long highest = 1 << shift;
        final StringBuilder binary = new StringBuilder(42);
        final String chatter = ") + (" + n + "<<";
        final long rest = highest - 1;
        while (true) {
            if (0 != (highest & m))
                binary.append(chatter).append(shift);
            if (0 == (rest & m)) {
                binary.append(')');
                return binary.substring(4);
            }
            m <<= 1;
            shift -= 1;
        }
    }

System.out.println(verboseBinaryProduct(n, m));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM