您的位置:首页 > 编程语言 > Java开发

列举1~30所有中的k,k^2,k^3都含有相同的数字d——我的艰难求解过程

2011-11-01 23:18 267 查看
题目:“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;
}
}
}
}

运行结果:



第一个问题解决,但真正的问题也来了,第二个bug才是真正苦恼我的,输出的不是所有的数值,观察发现原来输出的只是与k中个位相同的d,如k=12满足要求,k*k=144,k*k*k=1728,都含有相同的数字d=1,也就是说k不能取到它的十位数。于是我就在K^1上做文章,但最终还是失败。经插入断点逐步分析,只修改了两行,问题才成功解决。下面是修改后的代码:
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或许会更简单。。。

(由于客观条件所限,未能一次写完,未完待续)
网友有妙解,还请指点新手!






                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐