昨天在朋友的微博里看到一条关于数字迭代的有趣的题目。然后正好自己刚刚放假就没事写写,正好检验下我最近算法是否提高,其中弯路很多,追求在多次实践中来锻炼自己的逻辑和编码能力。

其中描述是:

把一个四位数的四个数字由小至大排列,组成一个新数,又由大至小排列排列组成一个新数,这两个数相减,之后重复这个步骤,只要四位数的四个数字不重复,数字最终便会变成 6174。

例如:
3109,
9310 - 0139 = 9171,
9711 - 1179 = 8532,
8532 - 2358 = 6174。
而 6174 这个数也会变成 6174,7641 - 1467 = 6174。
任取一个四位数,只要四个数字不全相同,按数字递减顺序排列,构成最大数作为被减数;按数字递增顺序排列,构成最小数作为减数,其差就会得6174;如不是6174,则按上述方法再作减法,至多不过10步就必然得到6174。
但是其中需要8步的初始数,我还没找(我把99999个随机数所转换数据导入到txt中,大小为8M,也没找到)
一个7步的示例:
如取四位数5679,按以上方法作运算如下:
9765-5679=4086 8640-4068=4572 7542-2457=5085
8550-5058=3492 9432-2349=7083 8730-3078=5652
6552-2556=3996 9963-3699=6264 6642-2466=4176
7641-1467=6174
其中c#实现代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;namespace ConsoleApplication3
{class Program{static int[] rnd;static int N = 0;const int result = 6174;static Random rn = new Random();static StringBuilder output = new StringBuilder();static void Main(string[] args){for (int i = 0; i < 99999; i++){rndArr(4);output.AppendLine("初始数为:" + arrToint(rnd).ToString());output.Append("差值过程数分别为:");if (function(rnd)){output.AppendLine("执行次数为" + N.ToString() + "次");output.AppendLine("");N = 0;}}try{string filepath = "d:/1.txt";FileStream fs = new FileStream(filepath, FileMode.Create);StreamWriter sw = new StreamWriter(fs);sw.Write(output);sw.Close();Console.WriteLine("success!");Console.WriteLine("已经写到" + filepath);}catch { Console.Write("0"); }Console.ReadKey();}/// <summary>/// 迭代求计算次数/// </summary>/// <param name="rTemp">差值循环</param>/// <returns>找到固定值返回True</returns>static bool function(int[] rTemp){cba(rnd); //整理成可转换成最大值的int[]int newint = arrToint(rTemp) - arrTointR(rTemp);N++;output.Append(newint + ",");if (newint == result){return true;}else return function(cba(intToarr(newint)));}/// <summary>/// 数组转换成数值(确保参数为最大值)/// </summary>/// <param name="a"></param>/// <returns>最大值</returns>static int arrToint(int[] a){string temp = "";for (int i = 0; i < a.Length; i++)temp += a[i].ToString();return Int16.Parse(temp);}/// <summary>/// 将数组反向再转换成数值(确保参数为最大值)/// </summary>/// <param name="a"></param>/// <returns>最小值</returns>static int arrTointR(int[] a){string temp = "";for (int i = 0; i < a.Length; i++)temp += a[a.Length - i - 1].ToString();return Int16.Parse(temp);}/// <summary>/// int值转成数组/// </summary>/// <param name="a"></param>/// <returns></returns>static int[] intToarr(int a){int length = a.ToString().Length;int[] re = new int[length];for (int i = 0; i < length; i++){re[i] = a / Convert.ToInt16(Math.Pow(10, length - 1 - i));a = a - re[i] * Convert.ToInt16(Math.Pow(10, length - 1 - i));}return re;}/// <summary>/// 产生初始随机数组/// </summary>/// <param name="length"></param>static void rndArr(int length){rnd = new int[length];int[] rndtemp = new int[rnd.Length];for (int i = 0; i < length; i++){do{rndtemp[i] = rn.Next(10);}while (validate(rndtemp, rndtemp[i], i) || rndtemp[0] == 0);}rnd = rndtemp;}/// <summary>/// Random Validate 如果存在返回true/// </summary>/// <param name="v"></param>/// <param name="x">当前序号标记</param>/// <returns></returns>static bool validate(int[] temp, int v, int x){int k = 0;for (int i = 0; i < x; i++){if (temp[i] == v)k++;}if (k > 0) return true;return false;}/// <summary>/// 随机数组转换成最大值数组/// </summary>/// <param name="temp"></param>/// <returns></returns>static int[] cba(int[] temp){for (int i = 0; i < temp.Length - 1; i++){for (int j = 0; j < temp.Length - i - 1; j++){if (temp[j] < temp[j + 1]){temp[j] = temp[j] + temp[j + 1];temp[j + 1] = temp[j] - temp[j + 1];temp[j] = temp[j] - temp[j + 1];}}}return temp;}}
}

其中用到了迭代算法,这算是第一次尝试,路漫漫,其中可能有一定多绕步,过路人可以指出,在下在这感谢各位。

参考资料:http://en.wikipedia.org/wiki/D._R._Kaprekar#cite_note-4

下面是网友给出的利用Linq写的算法:

        static void Main(string[] args){Process(1234, 1);Console.ReadKey();}private static void Process(int number, int deep){var numbers = new int[] { number % 10, (number % 100) / 10, (number % 1000) / 100, number / 1000 };var ascOrder = numbers.OrderBy(n => n).ToArray();var descOrder = numbers.OrderByDescending(n => n).ToArray();var weiQuan = 10000;var smaller = ascOrder.Select(a =>{weiQuan = weiQuan / 10;return a * weiQuan;}).Sum();weiQuan = 10000;var bigger = descOrder.Select(a =>{weiQuan = weiQuan / 10;return a * weiQuan;}).Sum();var diff = bigger - smaller;Console.WriteLine(string.Format("第{4}次:{0}:{1}-{2}={3}", number, bigger, smaller, diff, deep));if (diff == number){Console.WriteLine("That's just right");return;}else if (deep >= 10){Console.WriteLine("计算次数超过10次,尚未证明结果,退出");return;}else{Process(diff, ++deep);}}

首先我在随机4个数里面写了算法,然后在排序里面也相对写复杂了,网友这算法正是突显Linq编码优势的地方。

转载于:https://www.cnblogs.com/homchou/archive/2013/02/05/2893104.html

Kaprekar constant(卡普雷卡尔黑洞)相关推荐

  1. 用python实现卡普雷卡尔黑洞(重排求差黑洞)的计算

    目录 一.问题的由来 二.卡普雷卡尔黑洞描述 三.问题解决 1.解决思路 2.解决过程 (1)将输入的数字为数字列表 (2)生成最大数和最小数 (3)确定结束时机 (4)主程序部分 (5)逐步改进1( ...

  2. C#数字黑洞之一(卡普雷卡尔黑洞:重排求差黑洞)

    数字黑洞 数字黑洞,又称指的是某种运算,这种运算一般限定从某些整数出发,反复迭代后结果必然落入一个点或若干点的情况叫数字黑洞. 黑洞原是天文学中的概念,表示这样一种天体:它的引力场是如此之强,就连光也 ...

  3. matlab常数编程,Matlab编程,求解出卡普雷卡尔(Kaprekar)常数

    用matlab编程,计算出卡普雷卡尔(Kaprekar)常数 取任意一个4位数(4个数字均为同一个数的除外),将该数的4个数字重新组合,形成可能的最大数和可能的最小数,再将两者之间的差求出来:对此差值 ...

  4. 6174C语言编程,C语言代码实现:6174数学黑洞(卡普雷卡尔常数)

    1:6174数学黑洞现象 ,即常数. 任选4个不完全相同的数字(,如1111就不行),让减(例如8753-3578),不断重复这个动作,最后一定会得到相同的结果:. 神奇的是:这个"最大减最 ...

  5. 用Haskell写的卡普雷尔卡kaprekar黑洞小程序

    无意中在博客园里发现这个卡普雷尔卡黑洞题目,正好适合用haskell练手,就试着用Haskell实现了. 原题描述: 把一个四位数的四个数字由小至大排列,组成一个新数,又由大至小排列排列组成一个新数, ...

  6. 数字黑洞水仙花数6174卡普耶卡变换,卡布列卡常数归敛

    今天在头条上刷到一篇文章,挺有趣,不想点连接的话我直接把文章考过来了,不知道算不算侵权 头条文章链接 全文: 解析神秘数学黑洞"6174" 或许你早就听过这个故事:有一个神秘的数学 ...

  7. 数学黑洞6174java_奇妙的数字黑洞——6174

    原标题:奇妙的数字黑洞--6174 茫茫宇宙之中,存在着一种极其神秘的天体"黑洞".黑洞的密度极大,引力极强,任何物质经过它的附近,都会被它吸进去,再也不能出来,光线也不例外,因此 ...

  8. 用html和js编写黑洞数,数字黑洞作文400字

    数字黑洞作文400字 在学习.工作或生活中,大家都不可避免地要接触到作文吧,作文要求篇章结构完整,一定要避免无结尾作文的出现.作文的注意事项有许多,你确定会写吗?以下是小编为大家整理的数字黑洞作文40 ...

  9. 用python实现西绪福斯黑洞(即123数字黑洞)的演示

    目录 一.123数字黑洞描述 二.问题解决 1.内容描述 2.实现思路 3.代码功能实现 (1)分解输入的数字字符串,生成数字列表 (2)由数字列表生成新的数字字符串 (3)主程序实现输入和输出 三. ...

最新文章

  1. AMG8833的使用与stm32驱动代码
  2. 教你破解XP系统Administrator权限
  3. ubuntu 16.04 安装MySQL Workbench
  4. 计算机无法使用光驱启动,电脑BIOS怎么设置光盘启动 三种类型BIOS设置光驱启动的图文详解教程...
  5. 自动化测试===adb 解锁手机的思路
  6. C# 中利用 Conditional 定义条件方法
  7. java根据wait,notify,synchronize关键字自定义队列
  8. [Ext JS 4] 实战之多选下拉单 (带checkbox)
  9. 计算机网络中使用的双绞线通常是16芯的,自考计算机应用基础判断题试题答案...
  10. [JavaEE] 了解Java连接池
  11. c++ PP第十一章最后一题
  12. 计算机串口程序配置,串口设置软件 串口调试工具如何使用
  13. 2020哈工大深圳学硕上岸,控制原理133,英一84.
  14. 2021年制冷与空调设备运行操作考试题及制冷与空调设备运行操作证考试
  15. 聚类分析在用户行为中的实例_聚类分析案例之市场细分
  16. 服务器取证——服务器基础知识
  17. 武汉大学计算机学院 论文,武大计算机学院教授分享:学术论文投稿与Rebuttal经验...
  18. USRP工作流程及各部分功能
  19. Python基础语法笔记
  20. 字节跳动无恒实验室首次亮相Black Hat 2021亚洲黑帽大会:全生命周期管理的隐私保护框架

热门文章

  1. 使用谷歌学术检索论文小技巧
  2. 10 本最值得阅读的网络安全书籍推荐
  3. CAD看图软件怎么快速进行对图纸的打印?
  4. 20189220 余超《Linux内核原理与分析》第一周作业
  5. Gamma校正及其实现
  6. 2021-10-26 2021年B站1024安全攻防题第一题(加密解密)
  7. 基于FBX SDK的FBX模型解析与加载 -(三)
  8. 基于matab GUI的图形处理火焰检测系统
  9. VLookup怎么用详细步骤?VLookup函数的使用方法及实例
  10. ICAP: 互换客户端地址协议 1