问题描述
在诗人的眼中,数字是生活的韵律,也是诗意的表达。
小蓝,当代顶级诗人与数学家,被赋予了"数学诗人"的美誉。他擅长将冰冷的数字与抽象的诗意相融合,并用优雅的文字将数学之美展现于纸上。
某日,小蓝静坐书桌前,目光所及,展现着 n 个数字,它们依次为 a1,a2,…,an,熠熠生辉。小蓝悟到,如果一个数能够以若干个(至少两个)连续的正整数 相加表示,那么它就蕴含诗意。例如,数字 6 就蕴含诗意,因为它可以表示为 1+2+3。而 8 则缺乏诗意,因为它无法用连续的正整数相加表示。
小蓝希望他面前的所有数字都蕴含诗意,为此,他决定从这 n 个数字中删除一部分。请问,小蓝需要删除多少个数字,才能使剩下的数字全部蕴含诗意?
输入格式
第一行包含一个整数 n,表示展示的数字个数。
第二行包含 n 个整数 a1,a2,…,,表示展示的数字。
输出格式
输出一个整数,表示小蓝需要删除的数字个数,以使剩下的数字全部蕴含诗意。
样例输入
3
3 6 8
样例输出
1
样例说明
在样例中,数字 3 可以表示为 1+2,数字 6 可以表示为 1+2+3,数字 8 无法表示为连续的正整数相加,因此,需要删除的数字个数为 1。
评测用例规模与约定
对于 30% 的评测用例,1≤n≤10的3次方,1≤ai≤10的3次方。
对于所有评测用例,1≤n≤2×10的5次方,1≤ai≤10的16次方。
题解:
1.先输出下哪些数需被删除,即不能够以若干个(至少两个)连续的正整数 相加表示的数
public static void main(String[] args) {for (long i = 1; i < 1000; i++) {if (!J(i))//输出不能被连续正整数相加表示的System.out.println(i);}}public static boolean J(long n) {for (long i = 1; i < n; i++) {long next = i + 1;long sum = i + next;while (sum < n) {next++;sum += next;}if (sum == n)return true;}return false;}
输出结果:
![]()
显然,被删的数都为2的n次方
2.那么如何判断一个数为2的n次方
(1)若a为2的n次方,则a&&(a-1)==0(例如8的二进制为1000,1000&&0111==0)
if((a&(a-1))==0)//==的运算级比&高,&运算要加小括号return true;
(2)若a为2的n次方,a不断除2每次都余0,且最后结果为1
while (a % 2 == 0) a /= 2;if (a == 1)return true;
3.最终代码
import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//在此输入您的代码...int count=0;int n=sc.nextInt();for(int i=1;i<=n;i++){long j=sc.nextLong();if((j&(j-1))==0)count++;}System.out.println(count);sc.close();} }