Hướng dẫn giải của Giải phương trình bậc nhất 1 ẩn
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.
Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.
Bạn phải đăng nhập để mở lời giải này.
Đăng nhậpTác giả: , , ,
Hiểu bài toán
Viết chương trình giải phương trình bậc nhất một ẩn ax + b = 0 với a, b là các số nguyên.
- Nếu a = 0 và b = 0: Phương trình có vô số nghiệm (in ra 'WOW').
- Nếu a = 0 và b ≠ 0: Phương trình vô nghiệm (in ra 'NO').
- Nếu a ≠ 0: Phương trình có nghiệm duy nhất x = -b/a, in ra nghiệm được làm tròn đến 2 chữ số thập phân. Giới hạn: |a|, |b| ≤ 1000.
Các cách tiếp cận
Cách Xử lý số nguyên (Integer Arithmetic)
#include <stdio.h>
int main(){
int a,b;
scanf("%d %d",&a ,&b);
if(a==0){
if(b==0) printf("WOW");
else printf("NO");
}
else printf("%.2f", -1.0*b/a);
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Đây là cách tiếp cận trực tiếp nhất.
- Đọc hai số nguyên
avàb. - Kiểm tra
abằng 0:- Nếu đúng, kiểm tra tiếp
b: nếubbằng 0 in 'WOW', ngược lại in 'NO'. - Nếu sai, tính toán kết quả. Để in ra số thập phân, ta ép kiểu phép chia thành số thực:
-1.0 * b / a. Biến1.0(số thực) buộc phép chiab/ađược thực hiện dưới dạng số thực, đảm bảo kết quả có phần thập phân.
- Nếu đúng, kiểm tra tiếp
Cách Xử lý số thực (Floating-point Arithmetic)
#include <stdio.h>
int main (){
float a,b,x;
scanf ("%f %f", &a, &b);
if (a == 0 && b == 0){
printf ("WOW");
}
if (a == 0 && b != 0 ){
printf ("NO");
}
if (a != 0 ){
printf ("%.2f", x = (-b) / a );
}
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Cách tiếp cận này sử dụng kiểu dữ liệu float cho cả a và b.
- Đọc
avàbdưới dạng số thực. - Logic phân nhánh tương tự: kiểm tra điều kiện
avàbđể in 'WOW', 'NO' hoặc tính toán. - Phép tính
-b / ađược thực hiện trực tiếp trên số thực. Lưu ý: Mặc dù đọc số nguyên dưới dạng số thực thường an toàn trong giới hạn này, nhưng việc sử dụng số nguyên để kiểm tra điều kiệna==0thường chính xác hơn về mặt logic số học (tránh sai lệch giá trị số thực gần 0).
Cách Xử lý số nguyên cẩn thận (Kiểu dữ liệu lớn)
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int main()
{
long long a,b;
scanf("%lld ",&a);scanf("%lld",&b);
if(a==0)
{
if(b==0) printf("WOW");
else printf("NO");
}
else printf("%.2f",-(double)b/a);
return 0;
}
- Time Complexity: O(1)
- Space Complexity: O(1)
Đây là phiên bản mở rộng của Approach 1, sử dụng long long thay vì int.
- Mặc dù đề bài giới hạn |a|, |b| ≤ 1000 (vừa với
int), nhưnglong longđảm bảo không bị tràn số nếu inputs lớn hơn một chút. - Phép chia
-(double)b / aépbvề kiểudoubletrước khi chia, đảm bảo độ chính xác cao khi in ra màn hình. Logic xử lý 'WOW'/'NO' vẫn giữ nguyên.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(1) | O(1) | Xử lý số nguyên (Integer Arithmetic) |
| 2 | O(1) | O(1) | Xử lý số thực (Floating-point Arithmetic) |
| 3 | O(1) | O(1) | Xử lý số nguyên cẩn thận (Kiểu dữ liệu lớn) |
Bài học kinh nghiệm
- Phương trình ax + b = 0 có nghiệm x = -b/a khi a ≠ 0.
- Phải xử lý riêng trường hợp a = 0 (vô nghiệm hoặc vô số nghiệm) trước khi thực hiện phép chia để tránh lỗi chia cho 0.
- Để in số thập phân chính xác trong C, cần thực hiện phép chia số thực. Cách thường dùng là ép một toán hạng thành số thực (ví dụ:
-1.0 * b / a).
Lỗi thường gặp
- Quên kiểm tra trường hợp a = 0 dẫn đến lỗi chia cho 0 (Runtime Error) hoặc kết quả Infinity/NaN.
- Sử dụng phép chia số nguyên (ví dụ:
b / akhia,blà số nguyên) sẽ làm tròn kết quả về số nguyên,丢失 phần thập phân. - So sánh trực tiếp số thực (float) với 0 có thể không chính xác do sai số làm tròn máy tính (ví dụ: 0.0000001 != 0), nhưng trong bài toán này do input là số nguyên nên
scanfvào float vẫn cho giá trị chính xác 0 nếu input là 0.
Bình luận