当前等级

题目

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会溢出。

我的解法

  1. public class ASum {
  2. public static long findNb(long m) {
  3. long n = 0;
  4. long sum = 0;
  5. while (sum<m){
  6. n++;
  7. sum = sum + n*n*n;
  8. }
  9. if (sum == m){
  10. return n;
  11. }else{
  12. return -1;
  13. }
  14. }
  15. }

参考解法

  1. public class ASum {
  2. public static long findNb(long m) {
  3. long mm = 0, n = 0;
  4. while (mm < m) mm += ++n * n * n;
  5. return mm == m ? n : -1;
  6. }
  7. }

提升

  1. 出现nnn这样的运算时需要考虑是否会出现数据溢出的情况,要么将n设置成long、double ,或者使用Math.pow(n,3)这样的方法
  2. 当然如果你恰好知道 n^3+(n-1)^3+…+1^3=[n(n+1)/2]^2 ,那么就简单了,判断一下能否通过m解出n就可以了。