2011-06-30 22 views
7

thể trùng lặp:
Fastest way to determine if an integer's square root is an integerCó ai biết logic để tìm ra một con số là Perfect Square hay không?

Không ai biết logic để Tìm hiểu một số là Quảng trường hoàn hảo hay không? (Other than Newtons Method or Synthetic Division Method)

For Eg:- 4, 16, 36, 64 are Perfect Squares. 

tôi sẽ đưa ra các đầu vào như 441, logic nên nói cho dù nó là một quảng trường hoàn hảo hay không.

Đó là câu hỏi được đặt ra trong phỏng vấn của Amazon.

Tôi muốn làm điều đó với ra bất kỳ được xây dựng trong các chức năng

+4

[? Một thuật toán tốt để xác định xem một đầu vào là một hình vuông hoàn hảo là gì] (http://stackoverflow.com/questions/343852/whats-a-tốt-algorithm-to-xác định-nếu-một-đầu vào-là-một-hoàn hảo-square) –

+1

Nếu các trick là trên đầu vào chính nó sau đó, Vì 441 có một ở bên phải sau đó không có cách nào nó có thể là một Hình vuông hoàn hảo. –

+0

@Jalal: Điều gì, như 81 không? :-) – regularfry

Trả lời

14

Không Math.sqrt, thậm chí không nhân:

static bool IsSquare(int n) 
    { 
     int i = 1; 
     for (; ;) 
     { 
      if (n < 0) 
       return false; 
      if (n == 0) 
       return true; 
      n -= i; 
      i += 2; 
     } 
    } 
+0

Bây giờ thử nó mà không cần thêm hoặc nhân :) – Kibbee

+1

Có thể nói, tôi thực sự thích thuật toán này. – Kibbee

+1

Mặc dù từ điểm chuẩn nhanh, có vẻ như việc sử dụng phép nhân nhanh hơn. – Kibbee

3

Câu hỏi đầu tiên tôi sẽ hỏi người phỏng vấn là, "những trở ngại vấn đề là gì?" Đó là, số lượng đầu vào có thể lớn đến mức nào? Nếu nó đủ nhỏ, sau đó bạn có thể chỉ tính toán trước tất cả các sqaures hoàn hảo và lưu trữ chúng trong một cuốn từ điển:

IDictionary<long, bool> squares = new Dictionary<long, bool>; 
for(long i = 1; i*i <= MAX_NUM; ++i) { 
    squares[i*i] = true; 
} 

Sau đó, để tìm hiểu xem một số x là một hình vuông hoàn hảo, bạn chỉ cần đánh dấu ô vuông [x ] để xem nó có đúng không.

0

Điều gì đó dọc theo dòng này sẽ hoạt động.

public Boolean IsSquare(double input) 
{ 
    double root, product; 
    Boolean isSquare,isGTInput; 

    root = 1; 
    product = 0; 
    isSquare = false; 
    isGTInput = false; 

    while (!isSquare && !isGTInput) 
    { 
     product = root * root; 
     if (product == input) 
      isSquare = true; 
     else if (product > input) 
      isGTInput = true; 

     root += 1; 
    } 

    return isSquare; 

} 
+0

điều này sẽ đến theo tôi yêu cầu – Dotnet

+0

Xin lỗi, tôi không hiểu những gì bạn đang yêu cầu. – Kibbee

+0

Vì bạn đã sử dụng 'root * root', điều này sẽ theo như tôi đã hỏi – Dotnet

Các vấn đề liên quan