第六届蓝桥杯真题java_[蓝桥杯][2015年第六届真题]机器人繁殖 (Java代码)

解题思路:

设开始有x个机器人,若第n年后,机器人数目为s,有方程ax-b=s,列举出前n项后找到a,b增加的规律:int a=1,b=0,d=1;

for(i=0;i

d*=2;

a+=d;

b+=d-1;

}

再通过x=(s+b)/a可求出x的值;以上只是算法描述,当n取值为30,a的值就达到整型数的上限,n再增加,就会产生溢出,所以只能用大数进行加减乘除,大数加法用c语言实现并不难,但是要做乘除运算,实现起来很繁琐;只有考虑用java提供的BigInteger,问题就迎刃而解了。

注意事项:

遇到长度超过10、甚至超过20而且还要达到50的大数,用现有的库解决,远比自己再实现一遍更稳定和快速。

参考代码:import java.util.Scanner;

import java.math.BigInteger;

class Main{

public static void main(String[] args){

Scanner in=new Scanner(System.in);

int i,n;

n=in.nextInt();

String s=in.next();

BigInteger a=new BigInteger("1");       //方程ax-b=s中的a

BigInteger b=new BigInteger("0");       //方程ax-b=s中的b

BigInteger d=new BigInteger("1");

BigInteger sum=new BigInteger(s);

BigInteger two=BigInteger.valueOf(2);

BigInteger one=BigInteger.valueOf(1);

for(i=0;i

d=d.multiply(two);                  //d是上次的两倍

a=a.add(d);                         //a累加d

b=b.add(d.subtract(one));           //b累加d-1

}

BigInteger x=sum.add(b);

x=x.divide(a);                          //x=(s+b)/a

System.out.println(x);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值