2010-04-06 29 views
6

Tôi biết điều này có lẽ là một câu hỏi rất đơn giản nhưng làm cách nào để tôi thực hiện điều gì đó như n bằng ngôn ngữ lập trình?số bình phương trong lập trình

Có phải n * n không? Hoặc là có một cách khác?

+0

n * n là cách đơn giản nhất, nhanh nhất và dễ hiểu nhất. –

Trả lời

10

n * n là cách dễ nhất.

Đối với ngôn ngữ có hỗ trợ các nhà điều hành lũy thừa (** trong ví dụ này), bạn cũng có thể làm n ** 2

Nếu không, bạn có thể sử dụng một thư viện Math để gọi một chức năng như pow(n, 2) nhưng đó có lẽ là quá mức cần thiết cho chỉ đơn giản là bình phương một con số.

5

n * n sẽ hầu như luôn hoạt động - các trường hợp không hoạt động bằng ngôn ngữ tiền tố (Lisp, Scheme và co.) Hoặc ngôn ngữ postfix (Forth, Factor, bc, dc); nhưng rõ ràng là bạn chỉ có thể viết (* n n) hoặc n n* tương ứng.

Nó cũng sẽ thất bại khi có một trường hợp tràn bộ nhớ:

#include <limits.h> 
#include <stdio.h> 
int main() 
{ 
    volatile int x = INT_MAX; 
    printf("INT_MAX squared: %d\n", x * x); 
    return 0; 
} 

tôi ném chúng ra volatile lượng hóa trên đó chỉ để chỉ ra rằng điều này có thể được biên dịch với -Wall và không tăng bất kỳ cảnh báo, nhưng trên 32 của tôi máy tính -bit này nói rằng INT_MAX bình là 1.

Tùy thuộc vào ngôn ngữ, bạn có thể có một power chức năng như pow(n, 2) in C, hoặc math.pow(n, 2) bằng Python ... Từ những power chức năng đúc để floating- số điểm, chúng hữu ích hơn trong trường hợp có thể tràn.

+0

hoặc toán tử '^' hoặc '**' cho phép bạn thực hiện 'x = n^2' hoặc' x = n ** 2', nhưng nó giống với hàm 'pow'. – FrustratedWithFormsDesigner

+1

@FrustratedWithFormsDesigner: '^' được sử dụng cho bitwise 'XOR' trong hầu hết các ngôn ngữ lập trình vì vậy điều này nên được sử dụng cẩn thận. –

+0

@ Felix: Tốt, tôi đoán nó cho thấy tôi thường xuyên sử dụng 'XOR' như thế nào. ;-) – FrustratedWithFormsDesigner

2

Có nhiều ngôn ngữ lập trình, mỗi ngôn ngữ có cách thể hiện hoạt động toán học riêng.

Một số người thường sẽ là:

x*x 

pow(x,2) 

x^2 

x ** 2 

square(x) 

(* x x) 

Nếu bạn chỉ định một ngôn ngữ cụ thể, chúng tôi có thể cung cấp cho bạn hướng dẫn thêm.

+4

Nhưng bạn nên thêm rằng trong ** hầu hết các ngôn ngữ lập trình **, '^' được sử dụng cho bitwise 'XOR'. –

2

Nếu n là một số nguyên: p:

int res=0; 
for(int i=0; i<n; i++) 
    res+=n; //res=n+n+...+n=n*n 

Đối với số nguyên dương bạn có thể sử dụng đệ quy:

int square(int n){ 
if (n>1) 
    return square(n-1)+(n-1)+n; 
else 
    return 1; 
} 

Tính phân bổ sử dụng mảng (cực kỳ tiểu tối ưu):

#include <iostream> 
using namespace std; 

int heapSquare(int n){ 
    return sizeof(char[n][n]); 
} 

int main(){ 
for(int i=1; i<=10; i++) 
    cout << heapSquare(i) << endl; 
return 0; 
} 

Sử dụng phép dịch bit (phép nhân Ai Cập cổ đại):

int sqr(int x){ 
    int i=0; 
    int result = 0; 
    for (;i<32;i++) 
     if (x>>i & 0x1) 
     result+=x << i; 
    return result; 
} 

hội:

int x = 10; 
    _asm_ __volatile__("imul %%eax,%%eax" 
        :"=a"(x) 
        :"a"(x) 
        ); 
    printf("x*x=%d\n", x); 
+0

Chỉ để cho vui thôi;) – zoli2k

+0

... bởi vì đôi khi, không có thư viện nào đã thực hiện nó. ;) – FrustratedWithFormsDesigner

+0

Hmm, rất nhiều phiếu bầu. Tôi không hiểu. Người dùng đã không yêu cầu một tối ưu nhưng cho một cách khác ... :) – zoli2k

1

Luôn luôn sử dụng phép nhân của ngôn ngữ, trừ khi ngôn ngữ có một square chức năng rõ ràng. Cụ thể là tránh sử dụng chức năng pow do hầu hết các thư viện toán học cung cấp.Phép nhân sẽ (ngoại trừ trong trường hợp thái quá nhất) luôn nhanh hơn và - nếu nền tảng của bạn phù hợp với đặc điểm kỹ thuật IEEE-754, mà hầu hết các nền tảng đều làm - sẽ cung cấp kết quả được làm tròn chính xác. Trong nhiều ngôn ngữ, không có tiêu chuẩn chi phối tính chính xác của hàm pow. Nói chung nó sẽ cho kết quả chất lượng cao cho một trường hợp đơn giản như vậy (nhiều triển khai thư viện sẽ bình phương đặc biệt để lưu các lập trình viên), nhưng bạn không muốn phụ thuộc vào [1] này.

Tôi thấy một số tiền to lớn của C/C++ mã nơi các nhà phát triển đã viết:

double result = pow(someComplicatedExpression, 2); 

có lẽ để tránh gõ mà biểu hiện phức tạp gấp đôi hoặc bởi vì họ nghĩ rằng nó sẽ bằng cách nào đó làm chậm mã của họ để sử dụng một biến tạm thời . Nó sẽ không. Trình biên dịch rất, rất tốt trong việc tối ưu hóa loại điều này. Thay vào đó, hãy viết:

const double myTemporaryVariable = someComplicatedExpression; 
double result = myTemporaryVariable * myTemporaryVariable; 

Tóm lại: Sử dụng phép nhân. Nó sẽ luôn luôn là ít nhất là nhanh chóng và ít nhất là chính xác như bất cứ điều gì khác bạn có thể làm [2].

1) Trình biên dịch gần đây trên nền tảng chính thống có thể tối ưu hóa pow(x,2) thành x*x khi ngữ nghĩa ngôn ngữ cho phép. Tuy nhiên, không phải tất cả các trình biên dịch đều thực hiện điều này ở tất cả các cài đặt tối ưu hóa, đây là một công thức để sửa lỗi làm tròn lỗi. Tốt hơn là không phụ thuộc vào nó.

2) Đối với các loại cơ bản. Nếu bạn thực sự muốn thâm nhập vào nó, nếu phép nhân cần được thực hiện trong phần mềm cho kiểu bạn đang làm việc, có nhiều cách để thực hiện một phép toán bình phương nhanh hơn phép nhân. Bạn sẽ gần như không bao giờ tìm thấy chính mình trong một tình huống mà điều này quan trọng, tuy nhiên.

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