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.

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ập

Tác giả: Hiếu Nguyễn, mufininstinct, tle778047, nguyencongk53e

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.

  1. Đọc hai số nguyên ab.
  2. Kiểm tra a bằng 0:
    • Nếu đúng, kiểm tra tiếp b: nếu b bằ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ến 1.0 (số thực) buộc phép chia b/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.
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ả ab.

  1. Đọc ab dưới dạng số thực.
  2. Logic phân nhánh tương tự: kiểm tra điều kiện ab để in 'WOW', 'NO' hoặc tính toán.
  3. 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ện a==0 thườ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ưng long 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 ép b về kiểu double trướ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 / a khi a, b là 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 scanf vào float vẫn cho giá trị chính xác 0 nếu input là 0.

Bình luận

Please read the guidelines before commenting.


Không có bình luận tại thời điểm này.