[蓝蓝计算机考研算法训练二期]-day11

136 阅读1分钟

16、鸡兔同笼

已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡和兔的数目,如果无解,则输出“No answer”(不要引号)。

  • 输入 第一行输入一个数据a,代表接下来共有几组数据,在接下来的(a<10)、a行里,每行都有一个n和m.(0<m,n<100)
  • 输出 输出鸡兔的个数,或者No answer

思路

根据输入的鸡和兔的总只数和腿数从而建立二元一次方程组,for循环是寻找成立的第一个条件,if判断则是寻找成立的第二个条件。本项目的巧思在于,通过一些判断减少了循环的次数即,用兔的只数来进行循环,用兔的腿数来进行判断。

具体实现

int main() {
	int a, m, n, i, flag;
	printf("请输入数据组数:");
	scanf("%d", &a);
	
	while(a) {
		printf("请依次输入鸡和兔的总数量,总腿数:"); 
		scanf("%d %d", &m, &n);
		
		// 是否有解 
		flag = 0;
		for (i = 0; i <= m; i++) {
			if ((i * 4 + (m-i) * 2) == n) {
				// 两个二元一次方程若有解,则解必唯一,即有答案则跳出循环 
				printf("鸡有%d只,兔有%d只\n\n", (m-i), i);
				// 有解 
				flag = 1;
				break; 
			} else if (i *4 > n) // 当兔子的腿数多于总腿数时,再往后的循环都是多余的 
				break;
		}
		
		if ( flag == 0)
			printf("No answer");
		a--;
	}

	return 0;
}

image.png

小结

鸡兔同笼是一个经典的数学问题,最简单的方法就是循环遍历,但这样写出来的程序略显臃肿,本程序主要进行了代码的精简以及进行判断时的构思、