文章
2
粉丝
136
获赞
3
访问
11.7k
import java.util.Scanner;
public class SpecialNum {
/*
设一个正整数既是平方数又是立方数时,称之为Special数。
输入包含多组测试用例,
第一行输入测试数据的组数,
接着在后续每行输入n的时候,
请输出"1到n中"包含的所有Special数的个数。
n<= 1000000000
*/
//注1: 别摁循环 时间复杂度太高
//注2: 开根算太慢了 用乘方逆运算
//判断是否Special:用double存数据 开根之后减(int)看他是否为0
//核心: 用数组记录1-1000000000中所有special数
public static int IsSqrt(double j){
if (Math.sqrt(j) - (int) Math.sqrt(j) == 0)
return 1;
return 0;
}
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
//先判断哪些是special数
int[] special = new int[31]; //可以预判
int sp = 0;
//这里存在大量数的开根 会有不必要运算 比如10000开根和9999开根其实有大量重复计算
// for (int i=1; i<=1000000000; i++)
// if(IsSpecial(i)==1)
// special[sp++] = i;
//用乘方法只用一次从1-1000000000的遍历 甚至都没有这么多次
for (int i=1; i*i*i<=1000000000; i++)
...
登录后发布评论
暂无评论,来抢沙发