张三买鸡
公鸡五文钱一只,母鸡三文钱一只,小鸡一文钱三只,
用 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;
}
}