关于Java代码变量问题——局部和全局
在说明问题之前,先看一道蓝桥杯的题目:
立方变自身
观察下面的现象,某个数字的立方,按位累加仍然等于自身。
1^3 = 1
8^3 = 512 5+1+2=8
17^3 = 4913 4+9+1+3=17
…
请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?
请填写该数字,不要填写任何多余的内容或说明性的文字。
这题对于精通代码算法的大佬是非常简单的题目,只要用到除 / 和除余 % 即可完成运算。下面先看解析和一个错误代码。
解析:首先题目要求立方个个位和与自身相等,这就可以用 / 和 % 来实现,其次就是测试上限为多少的问题。首先我们知道个个位数上最大值为 9 ,那么我们不妨假设一下,100的立方为110^6,也就是说99的立方一定小于99 9999,而99 9999个个位数上和为69=54,很明显99的立方根一定比54要小,也就是说这些符合条件的数有限,而且不超100 。
下面是一个错误的测试代码,附加一错误结果图
public class cs {
public static void main(String[] args) {
int s=0; //全局变量初始化
int n=0;
for(int i=0;i<20;i++) {
n=i*i*i;
System.out.print("n0="+n+";"+"s0="+s+";"); //检测初值0
while (n/10!=0) {
System.out.print("n1="+n+";"+"s1="+s+";"); //检测运算过程1
s=s+n%10;
System.out.print("n2="+n+";"+"s2="+s+";"); //检测运算过程2
n=n/10;
}
s=s+n;
System.out.println("n3="+n+";"+"s3="+s+";"); //检测结果3
}
}
}
运行结果图:
解释:细心的人一看就知道是怎么一回事,本次错误代码就是因为全局变量和局部变量的关系才造成了 i = 3时,s = 9 而不是等于0 。全局变量虽然初始化了,但时局部变量没有每次初始化,造成了后面每次运算结果都是以上一次基础上更新。
修改后代码如下:
public class Main{
public static void main(String[] args) {
for(int i=1;i<50;i++) {
int n=i*i*i; //局部变量初始化
int s=0;
while (n/10!=0) {
s=s+n%10;
n=n/10;
}
s=s+n;
if(s==i) {
System.out.println(i); //输出结果
}
}
}
}
最后感谢阅读本章,还有感谢大佬a的帮忙测试,下一篇就解说回溯算法的思路——八皇后问题。