2011-10-13 7 views
6

Khi tôi sử dụng toán tử% trong các chương trình Java của mình, tôi tiếp tục nhận được các câu trả lời tiêu cực. Ví dụ: -1% 100 cho -1. Trong khi điều này là toán học chính xác, tôi muốn nhận được các giải pháp toán học bình thường, hoặc 99. Nói cách khác, tôi muốn nhận được giải pháp số nguyên dương nhỏ nhất. Có bất kỳ giải pháp đơn giản cho điều này trong Java (có lẽ một cái gì đó tôi bỏ qua trong toán học? - Tôi không thể tìm thấy nó)?Tôi làm cách nào để xử lý các mod không âm?

Tôi cũng muốn làm rõ rằng nếu có điều gì đó trong API thực hiện điều này, một liên kết sẽ thật tuyệt vời.

+0

Giải pháp toán học chính xác *** là *** giải pháp toán học bình thường. Bạn đã không hỏi câu hỏi của bạn rõ ràng nhưng có vẻ như bạn muốn lấy giá trị tuyệt đối của biến của bạn trước khi sửa đổi nó. – Perception

+1

@Perception, anh ta có nghĩa là anh ta muốn phần còn lại phân chia theo nghĩa của thuật toán phân chia. Đó là, anh ta muốn một giải pháp từ 0 đến 99, bao gồm. Hầu hết các nhà toán học (khác biệt với các nhà khoa học máy tính) sẽ thấy điều này như là khái niệm có ý nghĩa hơn về phần còn lại. – Hammerite

+0

Tôi đã luôn luôn thực hiện nó trong các lớp toán học là giải pháp số nguyên dương nhỏ nhất. Nhưng cũng vậy, -1 mod 100! = 1 mod 100. Đó có phải là ý của bạn không? – varatis

Trả lời

3

Bạn chỉ có thể thực hiện việc này?

int d = 100; 

int x = -1 % d; 
if (x < 0) 
    x += d; 

Điều này sẽ có tác dụng đối với bất kỳ tích cực d.

+0

Không, thật không may. 100 sẽ không phải lúc nào cũng là mod. Nó thay đổi. – varatis

+0

Bạn có cần xử lý mô đun phủ định không? – Mysticial

+0

Không, không có mô đun phủ định – varatis

2

Bạn có thể làm như sau

int myMod(int x, int modulo) 
{ 
    return ((x % modulo) + modulo) % modulo 
} 
+0

Điều này không hoạt động. Điều gì sẽ xảy ra nếu 'x = -201' và' modulo = 100'. – Mysticial

+0

Điểm tốt. Đã cập nhật. –

0

này hoạt động, đối với bất kỳ giá trị ở vị trí của d hoặc x.

int d=100; 
int x=-1%d; 
while (x<0) 
    x+=d; 
+0

Bạn vừa sao chép câu trả lời của tôi và thay đổi định dạng? (EDIT: Nevermind, bạn đã thay đổi 'if' thành' while'. Xem chú thích trên câu trả lời của tôi ...) – Mysticial

0
i < 0 ? n - ((-i - 1) % n + 1) : i % n 

Ví dụ:

class Mod { 
    public static int mod(int i, int n) { 
    return i < 0 ? n - ((-i - 1) % n + 1) : i % n; 
    } 

    public static void main(String [] args) { 
    System.out.println("mod(-201, 100) == " + mod(-201, 100)); 
    System.out.println("mod(-200, 100) == " + mod(-200, 100)); 
    System.out.println("mod(17, 100) == " + mod(17, 100)); 
    System.out.println("mod(100, 100) == " + mod(100, 100)); 
    } 
} 

$ javac Mod.java && java Mod 
mod(-201, 100) == 99 
mod(-200, 100) == 0 
mod(17, 100) == 17 
mod(100, 100) == 0 

Không vòng.

+0

Điều này không có tác dụng nếu i% n là 0 và i <0; ví dụ. mod (-200, 100) == 100 thay vì 0. –

+0

@LajosMolnar Đã sửa lỗi, cảm ơn bạn. – phs