问题描述
粮食公司需要将n吨粮食分配给若干分销商,每个分销商能够获得的粮食数量等于将n除以分销商数量,向下取整。问题是,计算在可能的分销商数量中,分销商获得的不同粮食数量有多少种可能。
例如,如果粮食总量为5吨,当分销商数量为1时,分销商获得5吨;当分销商数量为2时,分销商获得2吨;当分销商数量为3、4、5时,分销商获得的粮食依次为1吨。这样,不同的分配方案有3种可能。
思路分析
理解题意:
1.粮食总量为 n 吨。
2.分销商数量 k 可以是从 1 到 n 的任何整数。
3.每个分销商获得的粮食数量是n 除以 k 的向下取整
分析分配情况:
1.当 k=1 时,每个分销商获得 n 吨粮食。
2.当 k=2 时,每个分销商获得 n/2的向下取整吨粮食。
3.以此类推,当 k=n 时,每个分销商获得 n/n=1的向下取整吨粮食。
观察规律:
随着 k 的增加,n/k 的向下取整的值会逐渐减小。
我们需要找出 n/k的向下取整在 k 从 1 到 n 变化过程中有多少种不同的值。
计算不同值:
可以通过遍历 k 从 1 到 n,计算每个,n/k 的向下取整 的值,并使用一个集合(或列表)来记录这些不同的值。最后,集合(或列表)中的元素数量就是不同粮食数量的可能种类数。
数据结构的选择:
集合(Set):使用 HashSet 来存储不同的分配方案。HashSet 可以自动去重,确保每个分配方案只被计算一次。
算法步骤:
1.初始化集合:创建一个 HashSet 来存储不同的分配方案。
2.遍历分销商数量:从 1 到 n 遍历所有可能的分销商数量。
3.计算分配方案:对于每个分销商数量 i,计算每个分销商能够获得的粮食数量 n / i 的向下取整,并将结果加入集合中。
4.返回结果:集合的大小即为不同的分配方案的数量
代码实现
public static int solution(int n) {
// write code here
Set<Integer> set = new HashSet<>(n);
int count = 0;
for (int i = 1; i <= n; i++) {
set.add(n/i);
}
return set.size();
}