Hướng dẫn giải của Kiểm tra số chính phương


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.

Tác giả: Hieu Nguyen

Lưu ý: Hướng dẫn này dành cho ngôn ngữ C và C++, các bạn có thể suy luận để làm với các ngôn ngữ khác.

Phân tích bài toán

Đầu tiên, chúng ta cần chú ý giới hạn của các bộ test. Trong bài này, số cần kiểm tra nằm trong phạm vi từ ~-10^{12} \le n \le 10^{12}~.

Với phạm vi này, nếu dùng biến có kiểu dữ liệu int thì không đủ (tràn số) dần tới kết quả có thể bị sai, hãy sử dụng kiểu dữ liệu có khả năng lưu số lớn hơn, chẳng hạn như dùng long long thay thế.

Tiếp theo, làm rõ khái niệm số chính phương là số ~n~ nếu tồn tại số nguyên ~x~ mà ~x^2 = n~. Do đó, số chính phương nhỏ nhất sẽ là số ~0~.

Một lưu ý nữa, là sử dụng số thực trong lập trình có thể có sai số.

  • Các phép toán có kết quả là số thực thì các bạn nên dùng double thay cho float để lưu trữ được số thực với độ chính xác cao hơn.
  • Hạn chế số lượng phép tính (nếu có thể) vì tính toán trên số thực nhiều lần đồng nghĩa sai số tích lũy tăng lên.
  • Với bài này, các bạn có thể thử với một vài test lớn như 10000200000, 10000200001 (đây là số chính phương) hay 10000200002 để tìm lỗi của chương trình của mình.

Lời giải tham khảo

Code C++ của trungle

#include <stdio.h>
#include <math.h>
int main()
{
    long long n;
    scanf("%lld", &n);
    if (n < 0)
        printf("NO");
    else
    {
        if (n == 0 || n == 1)
            printf("YES");
        else
        {
            for (long long i = 2; i <= sqrt(n); i++)
                if (sqrt(n) == i)
                {
                    printf("YES");
                    return 0;
                }
            printf("NO");
        }
    }
    return 0;
}

Code C++ của hapq2011:

#include <bits/stdc++.h>

using namespace std;

int main(){
    long long n,a;
    cin >> n;
    a = sqrt(n);
    if (a * a == n){
        cout << "YES";
    }else{
        cout << "NO";
    }
}

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    hai123_456_  đã bình luận lúc 23, Tháng 11, 2023, 13:21

    include <stdio.h>

    include <stdlib.h>

    include<math.h>

    int main(int argc, char *argv[]) { double a; scanf("%lf",&a);

    while(a<0){ printf("VUi long nhap so lon hon 0\n"); scanf("%lf",&a); } double b=sqrt(a); if(b==(int)b){ printf("Yes"); }else printf("No");

    return 0;
    

    }


  • 0
    5kym4rk  đã bình luận lúc 8, Tháng 11, 2023, 1:16

    Một cách khác cho mọi người là dùng ép kiểu.


  • 0
    huy_vu1  đã bình luận lúc 15, Tháng 10, 2023, 16:51

    ai solo op mid map sunset inb ig:huy_nez