2021 是一个非常特殊的数,它可以表示成两个非负整数的平方差,2021 = 45 * 45 - 2 * 2。
2025 也是同样特殊的数,它可以表示成 2025 = 45 * 45 - 0 * 0。
请问,在 1 到 2021 中有多少个这样的数?
请注意,有的数有多种表示方法,例如 9 = 3 * 3 - 0 * 0 = 5 * 5 - 4 * 4,在算答案时只算一次。
结果只要一个整数
![](https://profile-avatar.csdnimg.cn/d2a2794e7c594da7b96da0cbff88e578_crazycode01.jpg!4)
java算法数字游戏特殊的数
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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; } }
解决 无用评论 打赏 举报
悬赏问题
- ¥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来回复数据