用Java来实现“找出一定范围内多个连续整数,使其立方之和恰好等于另一个整数的立方”
中国大学mooc,Java作业题
思路:
累加连续值得立方其实不算太难,有点像排序的方法,双重循环可以实现,这里困住我们的有可能是Java如何来判断一个整数
如何判断一个数是否整数呢
这里我并没有用网上所讲的所谓官方的方法,而是自己摸索出来一个小方法,我觉得这样摸索出来的小方法更加能够锻炼到编程的思维。
public class answer {
public static void main(String[] arg) {
double a,c;
int b;
a = Math.pow(27, 1.0/3);
c = Math.pow(216,1.0/3);
//c这里比较特别,6*6*6=216,但是反过来的时候,c等于5.99999999999
if (c%1==0){
System.out.println(c+"是一个整数");
}
else{
System.out.println(c+"并不是一个整数");
}
//这里对c进行处理,其实相当于四舍五入,但是不能直接用int来强制转换,这样所有数都会变成整数了
c = (float)Math.pow(216,1.0/3);
if (c%1==0){
System.out.println("处理之后 "+c+"是一个整数");
}
else{
System.out.println(c+"并不是一个整数");
}
if (a%1==0){
System.out.println(a+"是一个整数");
}
else{
System.out.println(a+"并不是一个整数");
}
//如果直接用int类型来强制转换,什么数都会变成整数
b = (int)Math.pow(10, 1.0/3);
System.out.println("int强制转换后,本来不是整数的都变成整数b = "+b);
}
}
运行结果:
5.999999999999999并不是一个整数
处理之后 6.0是一个整数
3.0是一个整数
int强制转换后,本来不是整数的都变成整数b = 2
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
这里用了两个数,虽然都是某个整数的3次方,但是反过来的时候216开3次方,并不会等于6,Math.pow( )这个函数返回一个double类型的值,这里也不知道是精度问题还是什么了,先不管。
从上面的小方法我们可以知道,一个数可以用Math.pow(a,b)来开方,其实是也可以用来求次方幂,第一个参数就是你要开方的数,第二个参数就是几次方,当第二个参数的值小于1,就是开方了。
开方出来会是一个double类型的数,我们在函数里面定义一个相同类型的来获取返回值。因为216开方问题,我们在前面加上float强制转换,这样会让本来是真正整数的数变回为整数,不是的转不了,这里一定不能用int类型强制转换!
出来一个数,要判断是否整数的话,直接对1取模,看看是不是等于0就好了。
附上完整代码,有不理解或者有异议的地方,都可以一起研究研究呀
public class test2{
public static void main(String[] arg) {
System.out.println("找到更多的这样的整数:一些相续正整数的立方和正好等于另一个整数的立方。");
//新建一个类的实例
test2 p = new test2();
//调用类实例中的方法
p.verify();
//Search方法中的参数,就是你搜索的范围,总不能一直做下去吧
p.Search(500);
}
//=======================================================================================
//verify是一个检验方法
public void verify(){
int sum = 0;
System.out.println("\n\n你已经来到了验证函数");
if ((3*3*3+4*4*4+5*5*5) == (6*6*6))
System.out.println("3*3*3+4*4*4+5*5*5 = 6*6*6");
for(int m=6;m<70;m++){
sum+=m*m*m;
}
//System.out.println("sum="+sum);
if (sum == (180*180*180))
System.out.println("6*6*6+7*7*7+....+69*69*69=180*180*180");
}
//=======================================================================================
//查找到更多相关的数,定义前面数的范围为1-200
public void Search(int max) {
int sum = 0;
double x;
System.out.println("\n\n你已经来到了查找函数");
for(int m=1;m<=(max-1);m++)
{
//保证有连续,不能只是一个数的立方和
sum = m*m*m;
for(int n=(m+1);n<=max;n++)
{
sum += n*n*n;
//如果不加float,不能表达出来,如3*3*3+4*4*4+5*5*5再开三次方会变成5.9999
x = (float)Math.pow(sum, 1.0/3);
if (x%1==0)
//开三次方出来是一个整数,直接输出表达式
System.out.println(m+"*"+m+"*"+m+"+"+(m+1)+"*"+(m+1)+"*"+(m+1)+"+"+"....+"+n+"*"+n+"*"+n+"=="+(int)x+"*"+(int)x+"*"+(int)x);
}
}
}
}