Fork me on GitHub

牛客网编程练习之编程马拉松:鸽兔同校

题目描述

浙江大学校园里绿树成荫,环境非常舒适,因此也引来一批动物朋友来此居住。
童心未泯的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);

		}

	}

}

 

 

题目来源: https://www.nowcoder.com/practice/5db1728ebfec4206bad8c3eee431faf9?tpId=3&tqId=10874&tPage=1&rp=&ru=/ta/hackathon&qru=/ta/hackathon/question-ranking

posted @ 2017-12-15 00:22  CC11001100  阅读(405)  评论(0编辑  收藏  举报