`
FlyAway2
  • 浏览: 111792 次
  • 性别: 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++

    卡布列克运算是一个有趣的数学规律,也被称为“6174现象”或“卡普雷卡尔常数”。在C++编程环境下,我们可以编写程序来验证这一规律。以下是关于这个运算的详细解释: 首先,卡布列克运算应用于一个四位数,前提是...

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

    ### 卡布列克运算法则详解 #### 一、卡布列克运算法则概述 卡布列克运算是一个数学游戏,涉及到一个四位数的处理方式。它由印度数学家Dattatreya Ramchandra Kaprekar于1949年发现,并以其名字命名。根据卡布列克...

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

    卡布列克数,也被称为卡迈克尔数,是一类在数论中具有特殊性质的整数。这些数的特点是对于所有小于它的质因数p,满足\( p^{(p-1)} \equiv 1 \mod n \)。简单来说,卡布列克数就是使得所有质因数的(p-1)次幂除以该数...

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

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

    卡布列克常数验证

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

    KaprekarNumbersTest.java 卡布列克数

    KaprekarNumbersTest.java 卡布列克数

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

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

    C-C++语言趣味程序设计编程百例精解

    卡布列克常数 84.尼科彻斯定理 85.回文数的形成 86.自动发牌 87.黑白子交换 88.常胜将军 89.抢30 90.搬山游戏 &lt;br&gt;C/C++语言经典实用趣味程序设计编程百例精解(10) (详解收藏在...

    Vijos 评测服务源代码

    Vijos 评测服务源代码提供了在线编程竞赛平台Vijos的核心组成部分——VTS.EXE的内部实现。这个系统是用Visual Basic .NET 2005编写的,虽然版本较为陈旧,但它揭示了早期在线自动评测系统的设计思想和技术栈。...

    第三次上机题.ppt_电子版_ppt版

    卡布列克运算涉及到对一个四位数进行特定的排序和计算,最终得到的结果总是6174或者0。在这个过程中,我们定义了一个过程`kblk(n)`,它执行卡布列克运算并可能递归地调用自身。每次调用,`kblk(n)`都会计算最大和...

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

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

    WEB实验报告一

    - **实验目的**:理解卡布列克运算的数学原理,并学会如何将其转化为程序实现。 - **实现细节**: - 输入一个4位数,确保各个位上的数字不完全相同。 - 将数字按从大到小排序得到最大数,从小到大排序得到最小数...

    C语言趣味算法

    22. 卡布列克常数:是一个数学常数,与素数分布的模式有关。 23. 尼科彻斯定理:涉及数的平方和与平方和的平方之间的关系。 24. 最大公约数和最小公倍数:基础的数论概念,是求解整数之间关系的常用算法。 25. 真...

    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 递归整数四则运算 ...

Global site tag (gtag.js) - Google Analytics