Bác nào định hướng cho e bài này với! Em xin cảm ơn.
VCT tính căn bậc ba của một số thực chính xác đến 0.001 – áp dụng thuật toán nhị phân, không dùng đến các hàm tính toán
Tính căn bậc 3 với độ chinh xác 0.001 bằng phương pháp chia đôi
giải pt x3 - n = 0 là ra
đặt f(x) = x3 - n
nếu n < 1 thì chọn xL = 0 và xR = 1 để f(xL) < 0 và f(xR) > 0
nếu n = 1 thì đáp số là 1
nếu n > 1 thì chọn xL = 0 và xR = n để f(xL) < 0 và f(xR) > 0
rồi tìm nhị phân xM = (xL + xR)/2 tới khi nào f(xM) = 0 hoặc xR - xL < 0.002 thì trả về xM
Cảm ơn bạn nhiều nhé, để mình thử xem
Hoặc còn có một cách khác.
Ta có:
- x3 = n
- x = n / x2
- x = (x + n / x2) / 2
Vậy ban đầu gán x bằng 1.
Rồi thực hiện gán x bằng (x + n / x2) / 2 cho đến khi |(x + n / x2) / 2 - x| < sai số đã cho.
Edit: Thiếu xử lý trường hợp x = 0.
Test thử thấy cũng lẹ ghê, không quá 35 loops.
https://rextester.com/VEUVL64094
Thay return count
thành return x
nếu thớt muốn lấy result.
Bạn ơi, mình đã tính được rồi nhưng mà không tính đến 0. 001 được
double Func(double x, double n){
return pow(x, 3) - n;
}
double canBac3(double n) {
const double epsilon = 0.001;
if (n == 1 || n == -1) return n;
double right;
double left;
double mid;
if (n < 1) {
right = 1;
left = 0;
while (right - left > epsilon) {
mid = (left + right) / 2;
if (Func(left, n) * Func(mid, n) < 0)
right = mid;
else
left = mid;
};
return mid;
}
else {
right = n;
left = 1;
while (right - left > epsilon) {
mid = (left + right) / 2;
if (Func(left, n) * Func(mid, n) < 0)
right = mid;
else
left = mid;
};
return mid;
};
}
cái này là sao đây?? :V
để tính xem nghiệm nó có nằm trong khoảng (left, mid) không á bạn, nếu không phải thì nó nằm trong (mid,right)
Giống như này nè bạn
sách bậy bạ :V :V Kiểm tra Func(mid) > 0 hay ko là được rồi tự dưng nhân vào làm gì @_@
sách viết rác rưởi sao solve ko trả về double mà trả về void, đi truyền x vào để chỉnh sửa x @_@
bớt đùa bác ơi, sách nhập môn lập trình của Đại học KHTN á :v
sách viết rác rưởi thì mình nói rác rưởi ko có đùa đâu :V
int main return 1 ???
sorry em đốt sách đó đi, đòi lại tiền
Đem lên hỏi ông thầy
- vì sao Solve trả về void mà ko trả về double
- vì sao hàm main lại trả về 1
- vì sao kiểm tra f(mid) âm hay dương lại phải nhân với f(left).
ko trả lời được thì lên hiệu trưởng xin đòi lại tiền học
hàm void truyền tham chiếu mà bác
khi f(mid) * f(left) < 0 thì nghiêm chắc chắn sẽ nằm trong đó, tiếp tục gán right = mid.
ngược lại thì nghiêm nằm trong (mid, right), gán mid = left
Còn việc return 1 hay 0 thì chương trình nó đều ra như nhau mà, có sai gì đâu, thầy bảo không sao
Vì chương trình có lỗi.
thầy bảo ko sao thì nghỉ học đi
f(left) đã bé hơn 0 rồi thì nhân vào làm gì??? Sao ko ghi là f(mid) > 0 thay vì f(mid) * f(left) < 0
lỗi chỗ nào vậy bạn ?
Danh sách lỗi anh TT đưa rồi.
lỗi chỗ trả về 1. main() return 0 mới là chương trình ko có lỗi…
cũng may viết code C ở cái bìa chứ thấy chữ void main
mình lại lên cơn rồi =]]]]]]]