2010-10-02 35 views
10

Tôi có thể khỏa lấp những yếu tố của A đến số nguyên gần lớn hơn hoặc bằng Atrần đến gần 50

ceil(A) 

Nhưng những gì về nếu tôi muốn làm tròn nó vào gần 50 lớn hơn hoặc bằng A ?

Ví dụ, do A mảng sau,

A=[24, 35, 78, 101, 199]; 

Một chương trình con nên trở lại như sau

B=Subroutine(A)=[50, 50, 100, 150, 200]; 

Trả lời

15

Bạn chỉ có thể chia cho 50, lấy ceil(), và nhân với 50 lần nữa :

octave:1> A=[24, 35, 78, 101, 199]; 
    octave:2> ceil(A) 
    ans = 

    24 35 78 101 199 

    octave:3> 50*(ceil(A/50.)) 
    ans = 

    50 50 100 150 200 
+1

Lưu ý rằng điều này có thể giới thiệu hình dung nổi-điểm lỗi làm tròn, cho các giá trị lớn trong A. –

+0

Meh, vì vậy hãy loại bỏ dấu thập phân sau 50 trong phân chia. Hoặc là các số đã là các giá trị dấu phẩy động, trong trường hợp đó vấn đề đã xuất hiện ở nơi khác trong mã, hoặc các số là số nguyên, trong trường hợp đó chỉ cần loại bỏ dấu thập phân và bây giờ bạn đang thực hiện phân chia số nguyên và bổ sung , trong trường hợp này không có vấn đề về dấu phẩy động. Vì vậy, tôi không thấy vấn đề ở đây. –

+0

Vấn đề là kết quả sẽ không chính xác. :-) Ví dụ, hãy thử '77777777777777777' làm đầu vào: phương thức này cho kết quả không chính xác' 77777777777777792', trong khi phương thức mô đun chính xác cho '77777777777777800'. –

8

Cách dễ dàng là chỉ cần thêm số bổ sung của mỗi số 50:

octave> A = [24, 35, 78, 101, 199] 

octave> mod(-A, 50)  # Complement (mod 50) 
ans = 

    26 15 22 49 1 

octave> A + mod(-A, 50) # Sum to "next higher" zero (mod 50) 
ans = 

    50 50 100 150 200 

octave> A - mod(A, 50) # Can also sum to "next lower" zero (mod 50) 
ans = 

    0  0 50 100 150 

(Lưu ý rằng điều này chỉ phụ thuộc vào số học số nguyên, mà tránh lỗi do dấu chấm tròn.)

+2

Tôi thích điều này vì nó khai thác phép cộng/trừ modulo, tức là, không có phép nhân/phép chia. Tuy nhiên, nếu bạn có một biểu thức phức tạp thay cho A, bạn có thể muốn trở lại giải pháp sử dụng hàm ceil vì biểu thức sẽ chỉ được gọi một lần trong phương thức đó. Tất cả hướng tới mục tiêu đơn giản của mã. – user36800