题目:“java题,列举1~30所有中的k,k^2,k^3都含有相同的数字d,如d=1,k=11,k^2=121,k^3=1331.”
(初学编程,只当拿拙劣代码公布自勉,记录自己的编程之路。)
编程时遇到的bug,考虑了好多天,可谓一波三折,终于找出问题所在,并逐步优化了代码。认为题型很有代表性,特发此贴,与君共赏,如高手另有妙解,还望不吝赐教!!
//下面是第一次编写的代码,有bug。
public class k{
public static void main(String args[]){
System.out.println("满足条件的k有:");
for(long k=1;k<=30;k++){
long k1Temp=k; //用来暂存k的信息
long k2Temp=k*k; //用来暂存k^2的信息
long k3Temp=K*k*k; //用来暂存k^3的信息
long qushu1=0; //用来取出k的每位的数
long qushu2=0; //用来取出k^2的每位的数
long qushu3=0; //用来取出k^3的每位的数
while(k1Temp>0){
qushu1=k1Temp%10;//取数
k1Temp=k1Temp/10;//实现右移
while(k2Temp>0){
qushu2=k2Temp%10;
k2Temp=k2Temp/10;
if (qushu1==qushu2)
break; //有相同的数时说明已找到,跳出此循环
}
while(k3Temp>0){
qushu3=k3Temp%10;
k3Temp=k3Temp/10;
if(qushu1==qushu2&&qushu1==qushu3){
System.out.print("d="+qushu1+"\t");
System.out.println("k="+k+"\t"+"k^2="+k*k+"\t k^3="+k*k*k);
break;
}
}
}
}
}
}
执行结果:
输出结果了,还是挺有成就感的。但仔细观察结果会发现还是有一些问题:
(1)几个结果重复出现了,如两次出现10。
(2)有几个数值也满足条件,但没有输出,如k=12,k*k=144,k*k*k=1728都含有相同的数字d=1。
第一个问题考虑了好一会,在第29行输入代码:“if(qushu1==qushu2&&qushu1==qushu3) break;”即可。下面是此处修改后的代码:
public class k{
public static void main(String args[]){
System.out.println("满足条件的k有:");
for(long k=1;k<=30;k++){
long k1Temp=k; //用来暂存k的信息
long k2Temp=k*k; //用来暂存k^2的信息
long k3Temp=k*k*k; //用来暂存k^3的信息
long qushu1=0; //用来取出k的每位的数
long qushu2=0; //用来取出k^2的每位的数
long qushu3=0; //用来取出k^3的每位的数
while(k1Temp>0){
qushu1=k1Temp%10;//取数
k1Temp=k1Temp/10;//实现右移
while(k2Temp>0){
qushu2=k2Temp%10;
k2Temp=k2Temp/10;
if (qushu1==qushu2)
break; //有相同的数时说明已找到,跳出此循环
}
while(k3Temp>0){
qushu3=k3Temp%10;
k3Temp=k3Temp/10;
if(qushu1==qushu2&&qushu1==qushu3){
System.out.print("d="+qushu1+"\t");
System.out.println("k="+k+"\t"+"k^2="+k*k+"\t k^3="+k*k*k);
break;
}
}
if(qushu1==qushu2&&qushu1==qushu3) break;
}
}
}
}
运行结果:
public class k{
public static void main(String args[]){
System.out.println("满足条件的k有:");
for(long k=1;k<=30;k++){
long k1Temp=k; //用来暂存k的信息
long k2Temp=k*k; //用来暂存k^2的信息
long k3Temp=k*k*k; //用来暂存k^3的信息
long qushu1=0; //用来取出k的每位的数
long qushu2=0; //用来取出k^2的每位的数
long qushu3=0; //用来取出k^3的每位的数
while(k1Temp>0){
k2Temp=k*k; //☆☆☆☆k的位置不能放在上面第6行处,否则该while循环一次结束后,k2temp,k3temp均已变成0,无法进行求解
k3Temp=k*k*k;
qushu1=k1Temp%10;//取数
k1Temp=k1Temp/10;//实现右移
while(k2Temp>0){
qushu2=k2Temp%10;
k2Temp=k2Temp/10;
if (qushu1==qushu2)
break; //有相同的数时说明已找到,跳出此循环
}
while(k3Temp>0){
qushu3=k3Temp%10;
k3Temp=k3Temp/10;
if(qushu1==qushu2&&qushu1==qushu3){
System.out.print("d="+qushu1+"\t");
System.out.println("k="+k+"\t"+"k^2="+k*k+"\t k^3="+k*k*k);
break;
}
}
if(qushu1==qushu2&&qushu1==qushu3) break;
}
}
}
}
运行结果:
原来问题不在k^1上,而是在k^2,k^3上:错误程序中,第一次外部while循环时已将k2Temp,k3Temp全部置0,再次执行外部循环时已不能判断k的十位数,最终导致少输出几个k。 找了好几天了的bug终于没有白费,于是跟好友炫耀一下,寒暄之余,也有好友提议:我这是C语言的编写风格,其实直接用java提供的API或许会更简单。。。
(由于客观条件所限,未能一次写完,未完待续)
网友有妙解,还请指点新手!