ปัญหา
กำหนดตัวเลข N และ D หาเศษจากการหาร N / D ห้ามใช้ตัวดำเนินการ % (modulo)
ตัวอย่าง: N = 53, D = 3 → เศษ = 2
วิธีแก้ปัญหา
วิธีที่ 1: หาตัวคูณที่ใกล้ที่สุด (Iterative)
หา i ที่น้อยที่สุดที่ทำให้ D * i ≥ N แล้วเศษ = N - D * (i-1)
int findRem(int N, int D) {
int i;
for (i = 0; ; i++) {
if (D * i >= N) break;
}
return N - (D * (i - 1));
}
วิธีที่ 2: ใช้ Integer Division (แนะนำ)
ใน C++ การหารจำนวนเต็ม N / D จะทิ้งเศษทิ้งให้อัตโนมัติ (Truncation toward zero)
int findRem(int N, int D) {
int Q = N / D; // ผลหาร (Quotient)
int R = N - D * Q; // เศษ = Dividend - Divisor × Quotient
return R;
}
วิธีที่ 3: ลบซ้ำ (Repeated Subtraction) - สำหรับการศึกษา
int findRem(int N, int D) {
while (N >= D) {
N -= D;
}
return N;
}
โค้ดตัวอย่างครบ (วิธีที่ 2)
#include <iostream>
using namespace std;
int findRem(int N, int D) {
int Q = N / D;
int R = N - (D * Q);
return R;
}
int main() {
int N = 45, D = 6;
cout << "The remainder after dividing " << N
<< " by " << D << " is " << findRem(N, D);
return 0;
}
Output
The remainder after dividing 45 by 6 is 3
ความซับซ้อน
| วิธี | Time | Space | หมายเหตุ |
|---|---|---|---|
| Iterative Multiplication | O(N/D) | O(1) | ช้า ถ้า N ใหญ่ D เล็ก |
| Integer Division | O(1) | O(1) | เร็วที่สุด แนะนำใช้ |
| Repeated Subtraction | O(N/D) | O(1) | ช้ามาก |
Input / Output
Input: N = 53, D = 3
Output: 2