蓝桥杯-数字诗意
问题描述
在诗人的眼中,数字是生活的韵律,也是诗意的表达。
小蓝,当代顶级诗人与数学家,被赋予了"数学诗人"的美誉。他擅长将冰冷的数字与抽象的诗意相融合,并用优雅的文字将数学之美展现于纸上。
某日,小蓝静坐书桌前,目光所及,展现着 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(); } }