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

求数字黑洞

J# 
阅读更多

import java.util.Stack;


/**
 * 功能描述:任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,
 * 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边
 * 补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:[82962, 75933,
 * 63954, 61974] 这个循环圈。请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中
 * 5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:[82962, 75933, 63954, 61974]
 * 其中数字的先后顺序可以不考虑。此程序兼容任何整数
 * @author Administrator
 *
 */
public class NumBlackHole {
 private int baseNum;
 private int size;
 private Stack<String> hole;
 private Stack<String> relHole;
 /**
  * @param 程序入口处
  */
 public static void main(String[] args) {
  if(args.length<1){System.out.println("请输入要找出数字黑洞的数字");System.exit(0);}
  int number=0;
  try {
   number=Integer.parseInt(args[0]);
  } catch (NumberFormatException e) {
   System.out.println("请输入正确的整数!");
   System.exit(0);
   e.printStackTrace();
  }
  NumBlackHole num=new NumBlackHole(number);
  num.Com();
 }
 /**
  * 构造方法
  * @param baseNum
  */
 public NumBlackHole(int baseNum) {
  this.baseNum = baseNum;
  this.size=(this.baseNum+"").length();
  hole= new Stack<String>();relHole=new Stack<String>();
 }
 /**
  * 开始计算
  */
 public void Com(){
  String base=baseNum+"";
  deal(base,1);
  deal(hole.peek(),2);
  System.out.print("[");
  int length=relHole.size();
  for(int i=0;i<length;i++){
   System.out.print(relHole.pop());
   if(i<length-1)System.out.print(" ");
  }
  System.out.println("]");
 
  
 }
 /**
  * 处理数字校正后的字符串
  * @param s
  * @param flag
  */
 private void deal(String s,int flag){
  switch (flag) {
  case 1:
   if(hole.contains(s))return;
   hole.push(s);
   break;
  case 2:
   if(relHole.contains(s))return;
   relHole.push(s);
   break; 
  default:
   break;
  }
  
  int value=Compare(s);
  String s1=check(value);
  deal(s1,flag);
 }
 /**
  * 校正数字的位数
  * @param value
  * @return
  */
 private String check(int value) {
  String tp=value+"";
  int a=tp.length();
  for(int i=0;i<this.size-tp.length();i++){
   tp="0"+tp;
  }
  return tp;
 }
 /**
  * 重新排列,求差值
  * @param s
  * @return
  */
 private int Compare(String s){
  int max=NumberTool.getNumber(s,1);
  int min=NumberTool.getNumber(s,-1);
  return max-min;
 }
}
class NumberTool{
 /**
  * 获得该字符串各个字符组成的整数
  * @param num_str
  * @param flag -1 最小整数 1最大整数 默认最大整数
  * @return
  */
 public static int getNumber(String num_str,int flag){
  if(!checkStr(num_str)){
   NumberFormatException exc=new NumberFormatException();
   throw exc;
   }else{
   int tmp[]=new int[num_str.length()];
   for(int i=0;i<num_str.length();i++){
    tmp[i]=Integer.parseInt(num_str.charAt(i)+"");
   } 
   for(int i=0;i<tmp.length;i++){
    for(int j=tmp.length-1;j>i;j--){
     switch (flag) {
     case 1:
      if(tmp[i]>tmp[j]){
       int tp=tmp[i];
       tmp[i]=tmp[j];
       tmp[j]=tp;
      }
      break;
     case -1:
      if(tmp[i]<tmp[j]){
       int tp=tmp[i];
       tmp[i]=tmp[j];
       tmp[j]=tp;
      }
      break;
     default:
      if(tmp[i]>tmp[j]){
       int tp=tmp[i];
       tmp[i]=tmp[j];
       tmp[j]=tp;
      };
     }
     
    }
   }
   int rtn=0;
   for(int i=0;i<tmp.length;i++){
    rtn+=tmp[i]*Math.pow(10,i);
   }
   return rtn;
  }
 }
 /**
  * 检查字符串中是否有非数字的字符
  * @param s
  * @return
  */
 private static boolean checkStr(String s){
  try {
   Integer.parseInt(s);
   return true;
  } catch (NumberFormatException e) {
   System.out.println("字符串中含有非法字符");
   return false;
  }
 }
}

分享到:
评论

相关推荐

    西西弗斯黑洞【123数字黑洞】 卡普雷卡尔黑洞(重排求差黑洞):三位数黑洞495

    西西弗斯黑洞【123数字黑洞】 /// ​设定一个任意数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数 /// 比如86420135799,按照偶数个数5,奇数个数6,数字总个数11,拼接成一个新的...

    数字黑洞问题C程序求解

    数字黑洞,指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后结果必然落入一个点或若干点。任意整数a,如果它的偶数位的个数为b,奇数位的个数为c,b和c的和为d,那么定义运算@:@a = bcd,比如 @647382 ...

    C++黑洞数字 很详细哦

    c++经典程序 int main() { srand((unsigned)time(NULL)); //时钟振荡产生随机数 int number = rand() % 10000; cout 产生的随机数为: "; int value = blackHoleNumber(number)... cout 黑洞数为: " ; return 0; }

    5--[数字黑洞1和4].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    5--[数字黑洞1和4].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[数字黑洞1和4].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[数字黑洞1和4].zip源码scratch2.0 3.0编程项目源文件源码...

    数字黑洞1

    算法提高 数字黑洞 时间限制:1.0s 内存限制:256.0MB 问题描述 任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律: 

    数字黑洞.nb

    mathematica演示数字黑洞,123黑洞、6174、水仙花数、角谷猜想 func[x_] := If[OddQ[x], 3*x + 1, x/2] NestWhileList[func, 27, # != 1 &] ListLinePlot[%, PlotRange -&gt; All]

    易语言源码易语言数字黑洞源码.rar

    易语言源码易语言数字黑洞源码.rar

    三位数重排求差“数学黑洞”

    【题目】495数学黑洞:任何一个数字不全相同的三位数,经过有限次“重排求差”操作,总会得495。“重排求差”操作:是将一个数的各位数字重排得到最大数减去最小数。请编程进行验证。 如:数107,“重排求差”操作...

    PTA黑洞数(C语言版)

    任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。) 例如...

    数字黑洞.cpp

    数字黑洞.cpp

    易语言数字黑洞

    易语言数字黑洞源码,数字黑洞

    5--[123数字黑洞].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    5--[123数字黑洞].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[123数字黑洞].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码5--[123数字黑洞].zip源码scratch2.0 3.0编程项目源文件源码案例...

    数字黑洞123.sb3

    数字黑洞123.sb3

    C++模拟“数字黑洞”

    数字黑洞: · 数字黑洞是指一些数字经过某些运算后而进入死循环。 随机选择4个数字(不可相同)按照从大到小排成一个数字,再用这个数字减去从小到大排成的数字,再把结果包括的数字按照以上步骤继续。最后7步必得...

    List数字黑洞6174.py

    List数字黑洞6174.py

    scratch2源码6174数字黑洞

    scratch2源码6174数字黑洞本资源系百度网盘分享地址

    scratch2源码123数字黑洞

    scratch2源码123数字黑洞本资源系百度网盘分享地址

    蓝桥杯历年C++题目:水仙花数和数字黑洞

    · 数字黑洞是指一些数字经过某些运算后而进入死循环。 · 随机选择4个数字(不可相同)按照从大到小排成一个数字,再用这个数字减去从小到大排成的数字,再把结果包括的数字按照以上步骤继续。最后7步必得包括6、1...

    数字黑洞 c语言

    任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次...如此往复,数字会落入某个循环圈(称为数字黑洞)。

Global site tag (gtag.js) - Google Analytics