原题链接:蓝桥杯2015年第六届真题-机器人繁殖
解题思路:
设开始有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分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复