Hướng dẫn giải của Kiểm tra số chính phương
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ả:
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
doublethay 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
ty
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