2015-05-29 36 views
4

對不起,這樣的基本水平的問題傢伙。但我是編程的開始。不是電腦的人。所以請幫助我。 在此代碼中,當我給出輸入1000000000,1000000000,,答案應該是4.但我的答案是1.我期望if語句執行,但它不在這裏執行。下面的代碼不會執行一些輸入

如果您將m * n視爲房間,將「a」視爲方形圖塊的邊。然後,我想要算最低號。的瓷磚需要填補房間的地板。瓷磚可能會覆蓋更多的區域,但不應該將房間留空。這是我的目標。它與輸入像6,6,4或15,20,13等工作。

現在它的工作人員。我已經發布了正確的代碼,並在下面做了一些小改動。

import java.util.Scanner; 
public class TheatreSquare { 
    private static Scanner input; 
    public static void main(String[] args) { 
    input = new Scanner(System.in); 
    float m=input.nextFloat(); 
    float n=input.nextFloat(); 
    float a=input.nextFloat(); 
    long i=(int)(m/a); 
    long j=(int)(n/a); 

    if((a*a*i*j)<m*n){ 

     if(a*i<m){ 
      //to check weather it is entering if() 
      System.out.println("true"); 
      i+=1; 
     } 
     if(a*j<n){ 
      System.out.println("false"); 
      //to check weather it is entering if() 
      j+=1; 
     } 
     } 
     System.out.println((double)(i*j)); 
    } 
} 
+1

我懷疑它的東西在這一行:'長I =(int)的(M/A);'或下一行'長J =(int)的(N/A);' 。當你像這樣分裂時,你會失去精確性。 – oleksii

+3

請詳細解釋你的程序應該做什麼。很難猜測 - 特別是當變量名稱沒有意義時。你應該根據他們所做的事情來命名這些變量。請編輯您的問題並添加必要的信息。 – RealSkeptic

+1

你能解釋一下這段代碼的最終目標是什麼?你想實現什麼?你有很多奇怪的投射(從float到int到long到double),很難判斷它們是否有意義而不知道它們背後的想法 –

回答

3

你的花車四溢。定義mnadouble旨意解決這一問題:

double m = input.nextDouble(); 
double n = input.nextDouble(); 
double a = input.nextDouble(); 
+0

Long不能持有十進制值嗎? – Krishna

+0

你是正確的部分。當我使用雙倍工作。謝謝你的線索。但是,你能解釋一下爲什麼它不適用於浮動(溢出意味着??) – Krishna

2

int轉換失去精度。

在這種情況下,a*a*i*j等於m*n因此if循環將不會執行。另外a*i等於ma*j等於n。 因此,我ISI和j是1,所以i*j爲1 Look at this

您需要允許它去,如果它等於過。 更換

if((a*a*i*j)<m*n){ 

     if(a*i<m){ 
      //to check weather it is entering if() 
      System.out.println("true"); 
      i+=1; 
     } 
     if(a*j<n){ 
      System.out.println("false"); 
      //to check weather it is entering if() 
      j+=1; 
     } 
     } 

與當你乘他們

if((a*a*i*j) <= m*n){ 
     System.out.println("Entered if block"); 
     if(a*i <= m){ 
      //to check weather it is entering if() 
      System.out.println("true"); 
      i+=1; 
     } 
     if(a*j <= n){ 
      System.out.println("false"); 
      //to check weather it is entering if() 
      j+=1; 
     } 
     System.out.println("i is:"+ i +"j is:"+j); 
     } 
+0

m * n是float,但在另一種情況下,它是int。您可以嘗試使用其他輸入,例如1000000000 1000000000 192或6 8 4或6 6 4或其他小整數。如果循環在這裏執行。 – Krishna

+0

@Krishna我想你需要讓循環執行,即使條件保持相等 –

+0

現在,這個問題解決了。但ans對輸入1,1,1是不正確的。 Ans應該是一個。因爲房間大小和瓷磚大小都一樣。應該只有一個瓷磚。但輸出是4.謝謝你的答覆,但它應該被改進。 @Uma Lakshmi Kanth – Krishna

1

原因你的行爲,你正在閱讀的數字爲浮動。浮點數的精度有限,所以你的m和a是相同的值(在運行時)。只要閱讀它們(並去掉所有的小數點)應該會有所幫助。但是,如評論所述,我們不知道你想達到什麼目的!

---編輯由於使用了新信息---

您必須覆蓋m的n次平方米。您的計算單位爲1瓦,即一平方米的時間(均假定爲十進制)。

假設你可以切斷與好足夠的精度的瓷磚,你的結果將是:

Math.ceiling((m*n)/(a*a)); 

即,無論是你的領域是你的瓷磚的整數倍(你總是可以削減他們的長方形,匹配房間的形狀),或者您將有一些「空餘」空間可供填寫,因此您需要再添加1個貼磚,其中一部分將用於覆蓋剩餘空間,其中一部分您會扔掉。

+0

對不起,含糊不清。現在我編輯了我的問題。 – Krishna

+0

我加了你的真正問題的答案然後:)看到我的編輯在這裏 –

2

thankyou @Mureinik,@Uma Lakshmi Kanth,@Diego Martinoia幫助解決這個問題。你所有的答案有助於解決我的問題。這現在正在工作。正如@Mureinik所說,我的浮標已經溢出(儘管我不知道它的含義)。我用Double而不是float,就是這樣。它的工作。:-)

import java.util.Scanner; 
public class TheatreSquare { 
private static Scanner input; 
public static void main(String[] args) { 
    input = new Scanner(System.in); 
    double m=input.nextDouble(); 
    double n=input.nextDouble(); 
    double a=input.nextDouble(); 
    long i=(long)(m/a); 
    long j=(long)(n/a); 

    if((a*a*i*j) <m*n){ 
     if(a*i < m){ 
      //to check weather it is entering if() 
      i+=1; 
     } 
     if(a*j < n){ 
      //to check weather it is entering if() 
      j+=1; 
     } 
     } 
    System.out.println((long)(i*j)); 
} 
} 
相關問題