统计可分解整数的数量
题目
定义一种特殊的整数序列,这种序列由连续递增的整数组成,并满足以下条件:
1.序列长度至少为 3。
2. 序列中的数字是连续递增的整数(即相邻元素之差为 1),可以包括正整 数、负整数或 0。
例如,[1, 2, 3]、[4, 5, 6, 7] 和 [−1, 0, 1] 是符合条件的序列,而 [1, 2](长度不 足)和 [1, 2, 4](不连续)不符合要求。
现给定一组包含 N 个正整数的数据 A1, A2, . . . , AN。如果某个 Ai 能够表示 为符合上述条件的连续整数序列中所有元素的和,则称 Ai 是可分解的。
请你统计这组数据中可分解的正整数的数量。
重要结论
一个数要表示为两个连续的整数的和的充要条件是这个数不能是2的幂。
解题思路
我们假设序列长度m(m>3),序列的起始数字k,N是要检查的数字
根据数学知识 2*N = m*(2*k+m-1)
化简 2*(N/m) = 2*k + m -1
由于右边是整数,所以m是N的一个因数
左边2*(N/m)是偶数,右边 2*k + m - 1 是偶数 + ? - 1 。
所以m一定要是奇数,所以N一定有一个奇数j因子,故N不能是2的幂
而对于其他不是2的幂的数,一定有一个奇数因子。
0可以由-1 0 1组成,其他不是2的幂的数都满足大于等于3
代码
import java.util.Scanner;public class Main {/* 定义一种特殊的整数序列,这种序列由连续递增的整数组成,并满足以下条件: 1.序列长度至少为 3。2. 序列中的数字是连续递增的整数(即相邻元素之差为 1),可以包括正整 数、负整数或 0。 例如,[1, 2, 3]、[4, 5, 6, 7] 和 [−1, 0, 1] 是符合条件的序列,而 [1, 2](长度不 足)和 [1, 2, 4](不连续)不符合要求。现给定一组包含 N 个正整数的数据 A1, A2, . . . , AN。如果某个 Ai 能够表示 为符合上述条件的连续整数序列中所有元素的和,则称 Ai 是可分解的。 请你统计这组数据中可分解的正整数的数量。*/public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int count = 0;//读取for (int i = 0; i < n; i++) {int num = sc.nextInt();//如果不是2的幂则计数if(!isPowerOfTwo(num)) count++;}}private static boolean isPowerOfTwo(int num) {return num > 0 && (num & (num - 1)) == 0;}
}