30/09/2018, 17:01
[Brute force] Tìm bội chung nhỏ nhất của 3 số bất kỳ
Yêu cầu
- Input: nhập 3 số nguyên: a, b, c
- Output: BCNN(a, b, c)
Khái niệm
Bội chung nhỏ nhất của các số nhất kỳ là số nhỏ nhất có thể chia hết cho tất cả các số đó
Ý tưởng, hướng giải
Ta sẽ tìm số lớn nhất nhất từ các số vừa nhập và cho nó chạy từ số đó đến khi nào số đang chạy có thê chia hết cho 3 số đã nhập thì dừng báo kết quả.
Giải quyết bài toán
- Bước 1: nhập 3 số a, b, c
- Bước 2: Tìm số lớn nhất từ 3 số a, b, c vừa nhập, gán vào i
- Bước 3: cho biến cho biến greater chạy -> vô cưc, đồng thời ra điều kiện nếu 3 số i đều chia hết cho 3 số a, b, c thì gán bcnn <- greater
- Bước 4: dừng vòng lập và in ra biến bcnn.
Chương trình mẫu (Python, PHP, C++)
Python
# Tìm BCNN của 3 số
# đinh nghĩa hàm
def bcnn(a, b, c):
# tìm số lớn nhất trong 3 số
if a > b and a > c:
greater = a
elif b > c:
greater = b
else:
greater = c
# chạy và tìm BCNN
while(True):
if((greater % x == 0) and (greater % y == 0) and (greater % z == 0)):
bcnn = greater
break
greater += 1
return bcnn
# Người dùng nhập vào 3 số a, b, c
a = int(input("Nhập vào a: "))
b = int(input("Nhập vào b: "))
c = int(input("Nhập vào c: "))
print "Vậy BCNN(a, b, c) = ", bcnn(a, b, c)
PHP
<?php
# Tìm BCNN của 3 số
# Kiem tra nguoi dung gui du lieu
if (isset($_POST['send']){
# đinh nghĩa hàm
function bcnn($a, $b, $c){
# tìm số lớn nhất trong 3 số
if ($a > $b && $a > $c)
$greater = $a;
elseif (b > c)
$greater = $b;
else
$greater = $c;
# chạy và tìm BCNN
while(true){
if(($greater % $x == 0) && ($greater % $y == 0) && ($greater % $z == 0)){
$bcnn = $greater;
$break;
}
$greater++;
}
return $bcnn;
}
# Người dùng nhập vào 3 số a, b, c
$a = $_POST['a'];
$b = $_POST['c'];
$c = $_POST['b'];
echo "Vậy BCNN(a, b, c) = ", bcnn($a, $b, $c);
}
## nguoi dung nhap du lieu
?>
<form method="POST">
Nhap a: <input type="number" name="a" /><br />
Nhap b: <input type="number" name="b" /><br>
Nhap c: <input type="number" name="c" /><br />
<input type="submit" name="send" value="OK" />
</form>
C++
#include <iostream>
using namespace std;
int bcnn( int a, int b, int c);
int main() {
int a, b, c;
cout << "Nhap 3 so a, b, c: ";
cin >> a >> b >> c;
cout << "BCNN(a, b, c) = : " << bcnn(a, b,c);
return 0;
}
// Tìm BCNN của 3 số
int bcnn( int a, int b, int c) {
// tìm số lớn nhất trong 3 số
int greater, bcnn;
greater = (a > b && a > c ) ? a : ((b > c) ? b : c);
// chạy và tìm BCNN
while (true) {
if (greater%a == 0 && greater%b == 0 && greater%c == 0){
bcnn = greater;
break;
}
++greater;
}
}
Có gì góp ý cho mình nha
Bài liên quan
Em thấy người ta hay dùng thuật toán Euclid để tìm ƯCLN, sau đó tính BCNN theo công thức
Không biết cách này có nhanh hơn không nữa.
Em có nên làm 1 bài về nó không nhỉ ?
ừ, mình thấy thông thường là theo cách này, nhưng 3 số thì cách của Kayz đơn giản hơn
Thật ra thuật toán Euclid chỉ dành cho 2 số :v
một thuật toán đơn giản để hiểu được cách thức tìm thôi. Với 2 số ta có thể sd cách trên hoặc thuật toán của Euclid
Có ai rebuild sang Java, C, Perl, Ruby cho đủ bộ
Mình nghĩ nên bắt đầu từ i=2*greatest và kiểm tra luôn greatest
cách này sẽ lời greatest-1 lần kiểm tra
Nhỡ 1, 2, 4 -> BCNN nó là 4, nếu bắt đầu i=2*greatest -> i=8 thành ra sai rồi
đầy đủ nhé, lời được (greatest-1)*3 phép tính nè
hợp lý! tại sao lại (greatest-1)*3 nhĩ
Tại vì mình phải thực hiện 3 phép tính để kiểm tra i/a, i/b, i/c
Good idea
Nếu mình biết các số còn lại có chứa snt nào thì còn lợi hại hơn. Lập hẳn một array snt và kiểm tra, cơ mà cách này thô quá dàng cho số bự bự, khoảng cách xa nhau thì ổn.
Có lẽ mình sẽ cải tiến một chút là chỉ kiểm tra những số i là bội của greatest thôi.
Vì điều kiện cần để là bội của 3 số là nó là bội của từng số.
Số lớn nhất là c thì chỉ kiểm tra các số c, 2c, 3c,…
ngày xưa toàn làm thế này thôi
Thuật toán của mình tìm bcnn cho n tham số:
Ý tưởng là gì vậy gió?
Tìm bội chung của n số:
Tư tưởng là BCNN(n số) = BCNN(n,(BCNN(n-1) số) :d
greater = (a > b && a > c ) ? a : ((b > c) ? b : c);
dòng này là sao vậy bạn
tìm số lớn nhất trong 3 số theo cách thủ công
(condition)? a : b;
if condition is true -> return a
else return b;
…
Vẫn chưa hiểu
mấy dấu ? và : là gì a
đấy là cách viết tắt thôi bạn:
(biểu thức điều kiện)? (trả về nếu điều kiện đúng):(trả về nếu điều kiện sai)
VD:
Thì cũng tương đương với cấu trúc: