`
FlyAway2
  • 浏览: 110425 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

我的 卡布列克

    博客分类:
  • j2ee
阅读更多

 

本来是很简单的东西,结果自己想快点做完,结果反而做了很久,而且做错!。。

 

做得辛辛苦苦,可惜还是没做对!

 

本来想用list的sort 帮忙实现排序的 ,后面采用手动的冒泡排序,又加上一个苦逼的算法,结果冒泡排序那块搞错了!

 

错了两次,

 

第一次:

 

		String[] bigger = sort(kabulekes,-1);
		String[] smaller = sort(kabulekes,1);

sort方法里面没有新建数组,导致bigger、smaller 是一样的值——即传值传引用的问题!

 

第二次:

//String s1 = strs[i]; -------------  这样引起问题~!

 

s1 写在第一个循环里面,导致冒泡排序实际失败。。。———— 这个好不容易才发现! 主要还是没有深入的真正的了解冒泡排序的算法—— 或者就是忘记了!。。。

 

package test;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public final class Demo {


	public static void main(String[] args) {
		System.out.println("VerifyKabulekeTheorem "
				+new Demo().VerifyKabulekeTheorem(5553));
		
		System.out.println("s1.compareTo(s2)<0 "+ "6".compareTo("2"));
	}
	
	/*
	功能: 验证卡布列克运算,任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
	1.将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
	2.将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数字中含有0,则得到的数不足四位);
	3.求两个数的差,得到一个新的四位数(高位0保留)。
	重复以上过程,最后得到的结果总是6174。这个数被称为卡布列克常数。

	原型:
	    int VerifyKabulekeTheorem(int m);
	输入参数:
	    int m:四位整数且各位数字不同(输入已保证)
	返回值:
	    0:整数m不是卡布列克数
	    >0: 结果为6174需要运算的次数
	*/

	public int VerifyKabulekeTheorem(int m)
	{
	    /*在这里实现功能*/
		
		if(m>999&&m<10000){
			String str = m+"";
			String[] kabulekes = new String[]{str.substring(0, 1),
					str.substring(1, 2),
					str.substring(2, 3),
					str.substring(3, 4)};
			if(kabulekes[0]==kabulekes[1]&&kabulekes[1]==kabulekes[2]
					&&kabulekes[2]==kabulekes[3]&&kabulekes[3]==kabulekes[4]) {
				return 0;
			}
			if(m==6174)return 0;
			return getKe(kabulekes);
		}

	    return 0;
	}
	
	int count = 0;
	
	private int getKe(String[] kabulekes) {
		String[] bigger = sort(kabulekes,-1);
		String[] smaller = sort(kabulekes,1);
		String[] ret = getNew(bigger, smaller);

		//System.out.println("ret "+ret[0]+ret[1]+ret[2]+ret[3]);
		
		count ++;
		if((ret[0]+ret[1]+ret[2]+ret[3]).equals("6174")) {
			return count;
		}
		return getKe(ret);
	}

	private String[] getNew(String[] bigger,String[] smaller) {
		String[] ret = new String[bigger.length];
		for (int i = 0; i < smaller.length; i++) {
			String s = smaller[i];
			String b = bigger[i];
		}
		String retStr = (Integer.valueOf(bigger[0]+bigger[1]+bigger[2]+bigger[3])-
				Integer.valueOf(smaller[0]+smaller[1]+smaller[2]+smaller[3]))+"";
		//if(retStr.equals("0"))return 0;
		if(retStr.length()==1) {
			retStr = "000"+retStr;
		}else if(retStr.length()==2) {
			retStr = "00"+retStr;
		}else if(retStr.length()==3) {
			retStr = "0"+retStr;
		}
		
		return  new String[]{retStr.substring(0, 1),
				retStr.substring(1, 2),
				retStr.substring(2, 3),
				retStr.substring(3, 4)};
	}

	private String[] sort(String[] strs,int order) {
		
		
		for (int i = 0; i < strs.length; i++) {
			//String s1 = strs[i]; -------------  这样引起问题~!
			//if(s1.equals('0'))continue;
			for (int j = i; j < strs.length; j++) {
				String s1 = strs[i];
				String s2 = strs[j];
				if(order==1){
					if(s1.compareTo(s2)>0){// ascend
						String temp = s1;
						strs[i] = s2;
						strs[j] = temp;
					}
				}else if(order==-1){
					if(s1.compareTo(s2)<0){// descend
						String temp = s1;
						strs[i] = s2;
						strs[j] = temp;
					}
				}
			}
		}
		String[] ret = new String[strs.length];
		ret[0] = strs[0];
		ret[1] = strs[1];
		ret[2] = strs[2];
		ret[3] = strs[3];
		//System.out.println(ret[0]+ret[1]+ret[2]+ret[3]);
		return ret;
	}
}

 

另一种解法

package huawei;

public class KK {
	

	public static void main(String[] args) {
		System.out.println("VerifyKabulekeTheorem "
				+new KK().VerifyKabulekeTheorem(4241));
	}
	
	public int VerifyKabulekeTheorem(int m)
	{
	    int iCount = 0;
	    while(true)
	    {
	        iCount++;
	        m = getMax(m) - getMin(m);
	        if(m == 6174)
	        {
	            return iCount;
	        }
	    }
	}
	private int getMax(int m)
	{
	    int[] iNum = new int[4];
	    for(int i=0; i<iNum.length; i++)
	    {
	        iNum[i] = m % 10;
	        m = m / 10;
	    }
	    
	    for(int i=0; i<4; i++)
	    {
	        for(int j=0; j<3-i; j++)
	        {
	            if(iNum[j] < iNum[j + 1])
	            {
	                iNum[j + 1] ^= iNum[j];
	                iNum[j] ^= iNum[j + 1];
	                iNum[j + 1] = iNum[j + 1]^iNum[j];
	            }
	        }
	    }
	    
	    return iNum[0]*1000 + iNum[1]*100 + iNum[2]*10 + iNum[3]*1;
	}
	
	private int getMin(int m)
	{
	    int[] iNum = new int[4];
        for(int i=0; i<iNum.length; i++)
        {
            iNum[i] = m % 10;
            m = m / 10;
        }
        
        for(int i=0; i<4; i++)
        {
            for(int j=0; j<3-i; j++)
            {
                if(iNum[j] > iNum[j + 1])
                {
                    iNum[j + 1] ^= iNum[j];
                    iNum[j] ^= iNum[j + 1];
                    iNum[j + 1] = iNum[j + 1]^iNum[j];
                }
            }
        }
        
        return iNum[0]*1000 + iNum[1]*100 + iNum[2]*10 + iNum[3]*1;
	}
	

}

 简单明了,而且正确!不过自己肯定写不出来,不熟悉 ^= 的用法。。

分享到:
评论

相关推荐

    卡布列克运算 C++

    验证卡布列克运算。 任意一个四位数,只要它们各个位置上的数字是不完全相同的,就有这样的规律: (1) 将组成这个四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数; (2) 将组成这个四位数的...

    验证卡布列克数 数据结构课程设计

    验证卡布列克数 数据结构课程设计 java语言编写 使用GUI

    卡布列克常数验证

    就是验证它啦,希望可以帮到大家忙

    098 卡布列克常数 C语言源代码文件

    098 卡布列克常数 C语言源代码文件

    验证卡布列克运算(带详细的运算分析资料)

    任意一个四位数,只要他们各个位置上的数字不全相同,就有这样的规律:(1)将组成这个四位数的四个数由大到小排列,形成由这四个数字构成的最大的四位数;(2)将组成这个四位数的四个数由小到大排列,形成由这四个...

    c语言实例解析-数值趣味数学篇

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    [第7讲]MPI通讯技术.ppt

    [第7讲]MPI通讯技术ppt,通讯是PLC应用过程中非常重要的部分,本章重点介绍了MPI通讯的基本概念,组建MPI网络的基本方法,分别介绍了无阻态的单边通讯和双边通讯的方法,通过一个项目详细介绍了全局数据通讯的实现...

    八皇后等算法C代码.rar

    八皇后、普里姆(prim)算法求最小生成树、贪心法求解装箱问题、求出k!、卡布列克常数等算法C代码

    VIJOS题库2.doc

     卡布列克圆舞曲  贪婪的送礼者  神风堂人数  粘贴文本  松鼠吃果子  文科生的悲哀  津津的储蓄计划  陶陶摘苹果  校门外的树  不高兴的津津  均分纸牌  CoVH之资料页数  Way ...

    若干C,C++语言经典实用趣味程序设计编程精解

    卡布列克常数 84.尼科彻斯定理 85.回文数的形成 86.自动发牌 87.黑白子交换 88.常胜将军 89.抢30 90.搬山游戏 &lt;br&gt;91.人机猜数游戏 92.人机猜数游戏(2) 93.汉诺塔 94....

    220个经典C程序源码文件,可以做为你的学习设计参考.zip

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    200个经典C程序源码(包括基础篇+数据结构篇+数值计算与趣味数学篇+图形篇+系统篇+常见试题解答篇).zip

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    220个C语言程序源代码集合.zip

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    220个C语言程序源代码.zip

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    200个C程序.rar

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    200个经典C程序【源码】

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    C语言经典源代码实例 数据结构 操作系统 图形等

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    C语言源代码实例.rar

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    经典的C程序220案列

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

    关于C的精粹包含至少200个C语言小程序

    098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 多项式乘法 106 产生随机数 107 堆栈四则运算 108 递归整数四则运算 ...

Global site tag (gtag.js) - Google Analytics