Java计算2017全国一卷12变式

原题

(2017•全国一卷)
    12.几位大学生响应国家的创业号召,开发了一款应用软件.
    为激发大家学习数学的兴趣,他们推出了“解数学题获取软
    件激活码”的活动.这款软件的激活码为下面数学问题的答案:
    已知数列1,1,2,1,2,4,1,2,4,8,1,2,4,8,16,…,
    其中第一项是
\large 2^{0^{}},接下来的两项是\large 2^{0^{}}\large 2^{1},再接下来的三项
    是
\large 2^{0^{}}\large 2^{1}\large 2^{2},依此类推.求满足如下条件的最小整数N:N>100
    且该数列的前N项和为2的整数幂.那么该款软件的激活码是(   )

       

          A. 440     B. 330     C. 220    D. 110       答案:A

思考:用Java求出题中数列满足前N项和等于2的整数次幂的所有可行解(在\large 2^{63}-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+"次幂");
				}
			}
		}
	}
}

运行结果

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丿彼与彼年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值