列举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。
输出结果了,还是挺有成就感的。但仔细观察结果会发现还是有一些问题:
(1)几个结果重复出现了,如两次出现10。
(2)有几个数值也满足条件,但没有输出,如k=12,k*k=144,k*k*k=1728都含有相同的数字d=1。
第一个问题考虑了好一会,在第29行输入代码:“if(qushu1==qushu2&&qushu1==qushu3) break;”即可。下面是此处修改后的代码:
运行结果:
第一个问题解决,但真正的问题也来了,第二个bug才是真正苦恼我的,输出的不是所有的数值,观察发现原来输出的只是与k中个位相同的d,如k=12满足要求,k*k=144,k*k*k=1728,都含有相同的数字d=1,也就是说k不能取到它的十位数。于是我就在K^1上做文章,但最终还是失败。经插入断点逐步分析,只修改了两行,问题才成功解决。下面是修改后的代码:
原来问题不在k^1上,而是在k^2,k^3上:错误程序中,第一次外部while循环时已将k2Temp,k3Temp全部置0,再次执行外部循环时已不能判断k的十位数,最终导致少输出几个k。 找了好几天了的bug终于没有白费,于是跟好友炫耀一下,寒暄之余,也有好友提议:我这是C语言的编写风格,其实直接用java提供的API或许会更简单。。。
(由于客观条件所限,未能一次写完,未完待续)
网友有妙解,还请指点新手!
(初学编程,只当拿拙劣代码公布自勉,记录自己的编程之路。)
编程时遇到的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或许会更简单。。。
(由于客观条件所限,未能一次写完,未完待续)
网友有妙解,还请指点新手!
相关文章推荐
- hdu 3434 给你含有n个数的序列,每次你可以选一个子序列将上面所有的数字加1或者减1,目标是把所有数字变成相同的,问最少步数,和那个相同的数字有多少种可能
- C语言:编写程序求解:有1,2,3,4,个数字,将组成互不相同且无重复数字出现的三位数打印出来
- 【算法】找出两个已序数组,是否含有相同的数字
- 30.输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
- 统计所有0到n之间所有含有数字1的数字和
- 数字拼图问题(八数码)求解过程动态演示
- 编写一个Java应用程序。用户从键盘输入一个1—9999之间的数,程序将判断这个数是几位数, 并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同, 例如12121、3
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?请输出所有组合
- C语言:编写程序求解:有1,2,3,4,个数字,将组成互不相同且无重复数字出现的三位数打印出来
- 求小于3000的所有含有数字3和8(如38)的整数的和
- 一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。
- 【算法】判断一个数是否含有相同的数字
- 程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不
- 要求输出从1到1000范围内所有与7相关数字的个数,与7相关的数字定义为,是7的倍数或者数字中含有7,比如17和71均含有‘7’。
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数。
- 查找介于n1与n2(0<n1<n2<32768)之间所有满足下列条件的整数: (1)该数的十进制表示中有且仅有两个相同的数字位; (2)该数是素数
- 对于一个数字,我们可以直观的了解到它所含有的数字,例如: 3243中包含1个2、2个3、1个4。 那么,给你一个数n,求从1到n之间的所有这些数字中,总共包含多少个m。
- C# 排列出所有不相同且无重复数字的N位数
- 查找所有含有表名(abc)的存储过程 执行脚本