java:大等于n的最小完全平方数
题目
问题描述
输出大等于n的最小的完全平方数。
若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数
Tips:注意数据范围
输入格式
一个整数n
输出格式
大等于n的最小的完全平方数
样例输入
71711
样例输出
71824
数据规模和约定
n是32位有符号整数
import java.util.Scanner;
public class 大等于n的最小完全平方数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.close();
//注意符号
if(n>=0){
//大于n的平方根的最大整数的平方
double m=Math.pow(Math.ceil(Math.sqrt(n)), 2);
System.out.println((int)m);
}else{
//小于n的平方根的最大整数的平方
n=-n;
double m=Math.pow(Math.floor(Math.sqrt(n)),2);
System.out.println(-(int)m);
}
}
}
60%的正确率,我觉得是我小数的符号附的有问题,精确度也有问题
我好像知道了,因为大于复数的最小完全平方数应该是0,平方数怎么能带符号
解决了一个问题,大于0的时候还有问题
应该是double转换为Int的时候精度出了问题
应该不能转为Int,而应该转换为long 型
这样就对了
import java.util.Scanner;
public class 大等于n的最小完全平方数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.close();
//注意符号
if(n>0){
//大于n的平方根的最大整数的平方
double m=Math.pow(Math.ceil(Math.sqrt(n)), 2);
System.out.println((long)m);
}else{
//小于n的平方根的最大整数的平方
System.out.println(0);
}
}
}
另一种代码
import java.util.Scanner;
public class 大等于n的最小完全平方数1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
long n=sc.nextInt();
sc.close();
double x=Math.sqrt(n);
long les=0;
//int 栈31位,而long占64位,n是占32位
//double x=Math.sqrt(n);//先开方,但有个问题,这个不能开方呀,万一是复数呢
if(n<=0)
les=0;
else if(((long)x*(long)x)==n){
les=(long)x;
}
//其他不能被开方的,转成整数会丢失精度,加1在乘方
else les=(long) x+1;
System.out.println(les*les);
}
}