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

题目:“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~30所有中的k,k^2,k^3都含有相同的数字d——我的艰难求解过程_第1张图片

输出结果了,还是挺有成就感的。但仔细观察结果会发现还是有一些问题:
(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;
			}	
		}
	}
}

运行结果:
列举1~30所有中的k,k^2,k^3都含有相同的数字d——我的艰难求解过程_第2张图片

第一个问题解决,但真正的问题也来了,第二个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;
			}	
		}
	}
}
运行结果:

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

原来问题不在k^1上,而是在k^2,k^3上:错误程序中,第一次外部while循环时已将k2Temp,k3Temp全部置0,再次执行外部循环时已不能判断k的十位数,最终导致少输出几个k。 找了好几天了的bug终于没有白费,于是跟好友炫耀一下,寒暄之余,也有好友提议:我这是C语言的编写风格,其实直接用java提供的API或许会更简单。。。

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






   

你可能感兴趣的:(java,编程,优化,api,String,Class)