题目描述
浙江大学校园里绿树成荫,环境非常舒适,因此也引来一批动物朋友来此居住。
童心未泯的NowCoder就经常带些碎面包什么的去广场喂鸽子和兔子,并和它们玩耍。 一点也没有大学生的样子,还是一副老不正经的样子,呵呵。
随着鸽子和兔子数目的增多,NowCoder带的那点食物已经不够它们瓜分了。为了能让自己的好朋友吃的饱饱的, NowCoder决定统计一下有多少只鸽子和有多少只兔子,以便带来足够的食物。一、二、三、四、五...他开始数了。
现在,他已经知道有这些鸽子和兔子一共有n个头和m只脚。请你帮他写个程序计算一下一共有多少只鸽子和兔子。
输入描述:
输入包括多组数据。
每行包括2个正整数n和m,n和m可能会很大,超过2^64,但位数不超过100位。
输出描述:
每组数据的输出都只有一行,分别是鸽子的数量和兔子数量。
如果输入的测试数据不能求得结果,那肯定是NowCoder这个马大哈数错了,就输出“Error”提示他。
示例1
输入
35 94
1 3
输出
23 12
Error
思路:
此类问题暴力破解不是个好办法,想办法从数学的角度来解决。
假设鸽子有x只,兔子有y只,则得到方程组:
x+y=n ①
x*2+y*4=m ②
将①变换带入②式,得:
(n-y)*2+y*4=m
2n-2y+4y=m
2n+2y=m
y=(m-2n)/2 ③
将读入的n和m带入③式,看有没有有效解即可。
只是有两个地方需要注意一下:
1. 使用大数运算
2. x和y的值只能是正整数
AC代码:
import java.math.BigInteger; import java.util.Scanner; /** * @author CC11001100 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextBigInteger()) { BigInteger n = sc.nextBigInteger(); BigInteger m = sc.nextBigInteger(); BigInteger t = m.subtract(n.multiply(BigInteger.valueOf(2))); if (t.mod(BigInteger.valueOf(2)).intValue() != 0) { System.out.println("Error"); continue; } BigInteger y = t.divide(BigInteger.valueOf(2)); BigInteger x = n.subtract(y); if(x.compareTo(BigInteger.ZERO)<0 || y.compareTo(BigInteger.ZERO)<0){ System.out.println("Error"); continue; } System.out.println(x + " " + y); } } }