2015-02-11 110 views
-5

我的任務問題: - 一本教科書最多有999頁。假設您將第一頁作爲1並將最後一頁作爲999,那麼您必須將1到999之間的數字(包括1和999)存儲爲一個數字[例如,第一頁是5,最後一頁是13,然後是數字被存儲爲5678910111213]。此外,我們還要計算出現最大次數的次數(即,在上面的示例1中重複5次,因此1的頻率爲5),然後打印該次數及其出現次數。如何在java中以字符串形式存儲超過50位的數字?

主要問題是存儲號碼。如果我分別取第一個和最後一個數字5和9,那麼我的程序工作,但5到13不起作用(不給我期望的數字)。

+0

爲什麼要使用字符串? – Benjoyo 2015-02-11 15:46:51

+2

您應該將當前的代碼與此問題一起發佈,否則我們只能推測爲什麼您獲得的結果不是您期望的結果。 – FatalError 2015-02-11 15:48:14

+0

字符串可以容納大約20億字符。向我們顯示代碼或我們無法幫助您。 – mstbaum 2015-02-11 15:52:51

回答

0

對於這種使用的字符串:

String pages=""; 
for(int i=1;i<=999;i++) 
{ 
     pages=pages+i; 
} 
0

BigDecimal類門店數爲字符串。 http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

雖然我不認爲這是你在找什麼。問題的要求是當你有一個包含從1到999(或某個任意範圍)的所有數字的字符串時,對數字1-9的頻率進行計數。最簡單的方法是將產生一個字符串for循環

爲(i = 1到999) A + =我

然後通過串檢查你所擁有的數字,並把它添加到一個計數器迭代。既然你有10位數字,你可以有一個簡單的數組計數器作爲地圖。

計數器[0] ++如果數字是0等

0

做出這樣的String

String pagestring = ""; 
for(int i=1;i<=999;i++){pagestring+=i;} 

然後作出char[]

char[] pagechar = pagestring.toCharArray(); 

計數數,並找到最大

for(char x:pagechar){ 
switch(x){ 
case "0": counter[0]++; 
... 
}} 
for(int y:counter){ 
int a = 0;if(y>a)y=a; 
} 
0

也許這可以幫助 -

public Map<Integer, Integer> getFrequencies(int start, int end) { 
    String num = ""; 
    for (int i = start; i < end + 1; i++) 
     num += i; 

    Map<Integer, Integer> frequencies = new HashMap<>(); 
    for (int i = 0; i < num.length(); i++) { 
     int digit = Character.getNumericValue(num.charAt(i)); 
     Integer frequency = frequencies.get(digit); 
     frequencies.put(digit, (frequency != null) ? ++frequency : 1); 
    } 
    return frequencies; 
} 

此外,爲了創造你應該使用BigDecimal一個非常大的數字。因此,建立在上面的例子中,你可以將String轉換成大量這樣的:

String num = ""; 
for (int i = start; i < end + 1; i++) 
    num += i; 

return new BigDecial(num); 
0

您可以使用字符串來連接所有數字和依靠Collections.frequency方法尋找最大出現數字。當我說數字時,我的意思是單個數字。即一個11將被視爲兩個1s

import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 


public class Pages { 

    public static void main(String[] args) { 
     int START = 5, END = 13; 
     StringBuilder numbers = new StringBuilder(); 
     for(int i=START; i<=END; i++){ 
      numbers.append(i); 
     } 
     List<String> digits = Arrays.asList(numbers.toString().split("(?<=\\G.{1})")); 
     String maxOccuring = ""; 
     int max = 0; 
     for(int i=0; i<10; i++){ 
      int frequency = Collections.frequency(digits, "" + i); 
      if(frequency > max) { 
       max = frequency; 
       maxOccuring = "" + i; 
      } 
     } 
     System.out.println("Number : " + numbers); 
     System.out.println("Max occuring didgit : " + maxOccuring); 
    } 

} 
+0

你能解釋我第11行的工作嗎「列表 digits = Arrays.asList(numbers.toString().split(」(?<= \\G {1})「))」? – Ayam 2015-02-12 14:59:53

+0

它製作一個List中的每個字符串。語法「(?<= \\ G. {1})」是一個匹配任何長度<= 1的字符的正則表達式。所以split方法會將我們的字符串分割爲每個字符並形成一個字符串數組。 'Arrays.asList'將把這個字符串數組轉換爲列表。 – 2015-02-12 15:43:29

相關問題