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.
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ả:
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 chofloat
để 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) hay10000200002
để 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
#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
:#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
Một cách khác cho mọi người là dùng ép kiểu.
ai solo op mid map sunset inb ig:huy_nez