CrazyCodePlayer.. 2021-11-27 14:04 采纳率: 44.4%
浏览 101
已结题

java算法数字游戏特殊的数

  2021 是一个非常特殊的数,它可以表示成两个非负整数的平方差,2021 = 45 * 45 - 2 * 2。
  2025 也是同样特殊的数,它可以表示成 2025 = 45 * 45 - 0 * 0。
  请问,在 1 到 2021 中有多少个这样的数?
  请注意,有的数有多种表示方法,例如 9 = 3 * 3 - 0 * 0 = 5 * 5 - 4 * 4,在算答案时只算一次。
结果只要一个整数

  • 写回答

1条回答 默认 最新

  • 钰娘娘 2021-11-27 15:13
    关注
    public class Main {
        public static void main(String[] args) {
            Main main = new Main();
            System.out.println(main.getDiffCnt(2021));
    }
        private int getDiffCnt(int max){
            List<Integer> subs = new ArrayList<>();
            int prev = 0;
            //先求平方i的平方,假设当前和后续的平方差大于最大值,说明后续没有需要的值了
            for(int i = 0,curr; prev+max>=(curr = i*i); i++){
                subs.add(curr);
                prev = curr;
            }
    
            //也可以用哈希,稠密度比较高,用数组更好
            boolean [] specials = new boolean[max+1];
            int n = subs.size();
            for(int i = 0; i < n-1; i++){
                //剪枝,当差值大于最大时,后续没有需要的值了,结束内循环
                for(int j = i+1; j < n&&subs.get(j)-subs.get(i)<=max; j++){
                    specials[subs.get(j)-subs.get(i)]=true;
                }
            }
    
            //计算数目
            int cnt = 0;
            for(int i = 1; i <= max; i++){
                if(specials[i])
                    ++cnt;
            }
    //       System.out.println(Arrays.toString(specials));
            return cnt;
    
        }
    }
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月7日
  • 创建了问题 11月27日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据