解题思路:
设开始有x个机器人,若第n年后,机器人数目为s,有方程ax-b=s,列举出前n项后找到a,b增加的规律:
int a=1,b=0,d=1; for(i=0;i<n;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<n;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); } }
0.0分
6 人评分