原题
(2017•全国一卷)
12.几位大学生响应国家的创业号召,开发了一款应用软件.
为激发大家学习数学的兴趣,他们推出了“解数学题获取软
件激活码”的活动.这款软件的激活码为下面数学问题的答案:
已知数列1,1,2,1,2,4,1,2,4,8,1,2,4,8,16,…,
其中第一项是,接下来的两项是
,
,再接下来的三项
是,
,
,依此类推.求满足如下条件的最小整数N:N>100
且该数列的前N项和为2的整数幂.那么该款软件的激活码是( )
A. 440 B. 330 C. 220 D. 110 答案:A
思考:用Java求出题中数列满足前N项和等于2的整数次幂的所有可行解(在-1之内)
并输出。
解题思路
写入代码的难点
①如何判断一个数是否是2的整数次幂
②注意基本数据类型的转换不要丢失精度
③由于数列中数据较大,应注意数据类型的大小
源代码
/**
(2017•全国一卷)
12.几位大学生响应国家的创业号召,开发了一款应用软件.
为激发大家学习数学的兴趣,他们推出了“解数学题获取软
件激活码”的活动.这款软件的激活码为下面数学问题的答案:
已知数列1,1,2,1,2,4,1,2,4,8,1,2,4,8,16,…,
其中第一项是2^0,接下来的两项是2^0,2^1,再接下来的三项
是2^0,2^1,2^2,依此类推.求满足如下条件的最小整数N:N>100
且该数列的前N项和为2的整数幂.那么该款软件的激活码是( )
A. 440 B. 330 C. 220 D. 110 答案:A
*/
public class ChoiceQuestion12 {
public static void main(String[] args) {
//N为所求值
//n为小于N的最大轮次
//k过渡变量
//SN为数列前N项和
long N;
long n=1L;
long k;
long SN;
//当N=1959时,数列前N项和等于2^63-1,恰好是
//long整型的最大值,由于计算时已超过,
//所以应将计算范围规定在[1,1959),N为整数
for(N=1L;N<1959;N++) {
while((n+2)*(n+1)/2<N) {
n++;
}
k=N-n*(n+1)/2;
//推导出SN的表达式
//注意要分开强制转换,否则精度丢失
//因为Math.pow()是double型
SN=(long)Math.pow(2,n+1)-n-3+(long)Math.pow(2,k);
//判断一个SN是否为2的整数次幂
for(long i=1L;i<63;i++) {
if(SN==(long)Math.pow(2,i)) {
System.out.println("数列的前"+N+"项和等于2的"+i+"次幂");
}
}
}
}
}
运行结果