2016-07-15 49 views
-3

訂單10^18的輸入n和輸出應該是其設定位僅爲2的所有數字的總和。對於例如n = 5個setbit是101-> 2個設定位。對於n = 1234567865432784,我如何優化下面的代碼?Java中的大型優化IO處理

class TestClass 
{ 
    public static void main(String args[]) 
    { 
     long N,s=0L; 
      Scanner sc = new Scanner(System.in); 

      N=sc.nextLong(); 
      for(long j = 1; j<=N; j++) 
      { 
       long b = j; 
       int count = 0; 
       while(b!=0) 
       { 
        b = b & (b-1); 
        count++; 
       } 

       if(count == 2) 
       { 
        s+=j; 
        count = 0; 
       } 
       else 
       { 
        count = 0; 
        continue; 
       } 
      } 
      System.out.println(s%1000000007); 
      s=0L; 
    } 

} 
+0

[看看這個(HTTPS:/ /en.wikipedia.org/wiki/Sieve_of_Eratosthenes) – SMA

+0

你剛剛編輯了你問的問題,使它成爲一個完全不同的問題? –

+0

我首先輸入了一個錯誤的問題Leo,請幫助我解決這個問題。 – sagnikDas

回答

0

Java提供的類BigInteger,這包括一種方法nextProbablePrime()。這意味着你可以做這樣的事情:

BigInteger n = new BigInteger(stringInputN); 
BigInteger test = BigInteger.valueOf(2); 
BigInteger total = BigInteger.valueOf(0); 
while (test.compareTo(n) < 0){ 
    total = total.add(test); 
    test = test.nextProbablePrime(); 
} 
System.out.println(total); 

這這有得到錯誤的答案(但非零)的概率極低,所以你可能要運行它兩次,只是雙檢。它應該比手動迭代手動更快。

1

Java有一個功能

if (Integer.bitCount(i) == 2) { ... 

但是考慮了一下:這是數字檢查的很多

怎麼樣生成所有隻有兩位數的數字?

設置我和j 位的n

int n = (1 << i) | (1 << j); // i != j 

現在考慮31²步驟,尚未1000 N步。

因爲這是我的功課提醒:

嘗試扭轉這個問題,做了最少的功,後退一步,找到聰明的做法,搜索數學核心。 並享受。

下一次,不要破壞自己的成功時刻。

+0

我需要使用快速IO技術來讀取大量輸入並打印大量輸出。我認爲你對這個問題的處理方式很優雅。我試圖實現這一點,如果我沒有得到它,我可能會要求更多的解釋。 – sagnikDas

+0

@sagnikDas我實際上在3小時前的回答中提供了這裏描述的實現。 IO不知道你的意思。我無法找到任何與你的問題相關的IO。 –

+0

我明白我在具體沒有提到IO的問題。我稍後要求,如果我們可以使用像BufferedReader或BufferedInputStream這樣的快速IO技術來獲取我認爲比Scanner更快的輸入。我需要知道實施技巧 – sagnikDas

1

正如你可能有足夠的時間去思考喬普埃根的建議, 這裏是如何我會做(這是喬普描述我認爲):

import java.util.Scanner; 

public class Program { 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     long n = sc.nextLong(); 

     long sum = 0; 

     for (int firstBitIndex = 0; firstBitIndex < 64; firstBitIndex++) { 
      long firstBit = 1L << firstBitIndex; 
      if (firstBit >= n) 
       break; 
      for (int secondBitIndex = firstBitIndex + 1; secondBitIndex < 64; secondBitIndex++) { 
       long value = firstBit | (1L << secondBitIndex); 
       if (value > n) 
        break; 
       sum += value; 
      } 
     } 
     System.out.println(sum % 1000000007); 
     sc.close(); 
    } 
} 
+1

@JoopEggen你說的對,我忘了「L」。我修改了代碼。無論如何,人們必須非常小心,因爲最後一位會切換符號,這肯定會干擾> n比較。因此,悲傷的Java沒有適當的無符號類型... –

+1

關於符號:N = 10^18 = 10^3^6 <= 2^10^6 = 2^60所以61或63的界限)就夠了。沒有必要糾正,因爲n給出。 –

+0

@JoopEggen哦,是的,忘了這一點 –