题目
Your task is to construct a building which will be a pile of n cubes. The cube at the bottom will have a volume of n^3, the cube above will have volume of (n-1)^3 and so on until the top which will have a volume of 1^3. You are given the total volume m of the building. Being given m can you find the number n of cubes you will have to build? The parameter of the function findNb (find_nb, find-nb, findNb) will be an integer m and you have to return the integer n such as n^3 + (n-1)^3 + … + 1^3 = m if such a n exists or -1 if there is no such n. 你的任务是建造一个由n个立方体组成的建筑。底部的立方体体积为n^3,上面的立方体体积为(n-1)^3,依此类推,直到顶部的立方体体积为1^3。 你得到的是大楼的总体积。给定m,你能找到你要建立的立方体的数目n吗? 函数findNb(find_nb, find-nb, findNb) 的参数将是一个整数m,您必须返回整数n,例如n^3+(n-1)^3+。。。+1^3=m;如果没有这样的n,则-1。
例子
findNb(1071225) —> 45 findNb(91716553919377) —> -1
分析
题目比较简单,遍历相加,最后比较一下就可以了。需要注意的是n应该是long类型而不是int,否则nnn会溢出。
我的解法
public class ASum {
public static long findNb(long m) {
long n = 0;
long sum = 0;
while (sum<m){
n++;
sum = sum + n*n*n;
}
if (sum == m){
return n;
}else{
return -1;
}
}
}
参考解法
public class ASum {
public static long findNb(long m) {
long mm = 0, n = 0;
while (mm < m) mm += ++n * n * n;
return mm == m ? n : -1;
}
}
提升
- 出现nnn这样的运算时需要考虑是否会出现数据溢出的情况,要么将n设置成long、double ,或者使用Math.pow(n,3)这样的方法
- 当然如果你恰好知道 n^3+(n-1)^3+…+1^3=[n(n+1)/2]^2 ,那么就简单了,判断一下能否通过m解出n就可以了。