每日作业20210107

在这里插入图片描述

张三买鸡
公鸡五文钱一只,母鸡三文钱一只,小鸡一文钱三只,
用 n 文钱买 m 只鸡, 有多少种购买方案?
输入: 两个正整数n,m
(n<=1000, m<=1000)
输出:
k行数据, 表示有k种方案,
每行三个整数, 分别表示公鸡, 母鸡, 小鸡各买了多少只
样例输入:
100 100
样例输出:
0 25 75
4 18 78
8 11 81
12 4 84

public class Task17 {
	public static void main(String[] args) {
		//如果有结果 返回的应该是数组,所以建立一个集合来存放数组
		List<int[]> list = new ArrayList<>();
		//接收返回值
		list = result(100, 100);
		//返回为null时,是输入参数错误
		if(list == null) {
			System.out.println("你的输入有误");
			//集合长度为0则没有正确的解
		} else if(list.size() == 0) {
			System.out.println("没有正确的解");
		} else {
			for (int[] is : list) {
				//打印解
				System.out.println(Arrays.toString(is));
			}
		}
		
	}
	
	public static List<int[]> result(int n, int m) {
		//创建一个集合来存放结果
		ArrayList<int[]>  list = new ArrayList<int[]>();
		//先判断给的参数是否正确,如果不在取值范围则返回null
		if(n <= 1000 && m <= 1000) {
			//公鸡最大值为n/5
			for(int i = 0; i <= n / 5; i++) {
				//母鸡的最大值为n/3
				for(int j = 0; j <= n / 3; j++) {
					//两个方程相减消去小鸡这个参数,求得成立的条件
					if(14 * i + 8 * j == (3 * n - m)){
						//存放解的数组
						int[] arr = new int[3];
						arr[0] = i;
						arr[1] = j;
						arr[2] = m - i - j;
						list.add(arr);
					} 
				}
			}
			return list;
		} else {
			return null;
		}
	}
}

此种写法为了区分是输入错误还是没有解,设置了当输出错误的时候返回null,没有正确解的时候集合的长度为0
集合长度为0:
声明一个集合,但不赋值,指向一个新建、未初始化的集合对象。则该集合长度为0,但是不为空。

ArrayList<int[]>  list = new ArrayList<int[]>();
//此时集合长度为0

集合为null:
声明一个集合,直接赋值为空。则该集合为null,没有长度,如果调用temp.size()会抛出空指针异常。

ArrayList<int[]>  list = null;

附加修改为一个循环的写法

public static List<int[]> result(int n, int m) {
		//创建一个集合来存放结果
		ArrayList<int[]>  list = new ArrayList<int[]>();
		//先判断给的参数是否正确,如果不在取值范围则返回null
		if(n <= 1000 && m <= 1000) {
			//公鸡最大值为n/5
			for(int i = 0; i <= n / 5; i++) {
				//先判断母鸡数量是否为整数
				if((3 * n - m - 14 * i) % 8 == 0) {
					//如果为整数,即为母鸡可能的取值将其赋予b
					int b = (3 * n - m - 14 * i) / 8;
					if(b > 0 && 14 * i + 8 * b == (3 * n - m)) {
						 int[] arr = new int[3];
							arr[0] = i;
							arr[1] = ((3 * n - m) - 14 * i)/8;
							arr[2] = m - i - ((3 * n - m) - 14 * i)/8;
							list.add(arr);
					 }
				}
			}
			return list;
		} else {
			return null;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值