• 用C语言验证 “6174黑洞之谜”!万物始于C,编程世界的黑洞!


    今儿跟大伙分享一个数字之谜——6174之谜,看看我们是怎么用C语言验证它的。

    先简单介绍一些跟我们这个题目相关的背景知识。

    黑洞,我想不少人都听说过,意思就是宇宙中的黑洞可以将任何物质,以及运行速度最快的光牢牢吸住,不使它们逃脱。

    数学黑洞也是如此,也就是对于规定的数字来说,无论怎样设值,在规定的处理法则下,最终都将得到固定的一个值,再也跳不出去了,我们今天所说的“6174黑洞”就是这个意思。


     

    1955年,印度数学家卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m)。

    然后,继续对k1重复上述变换,得数k2。如此进行下去,卡普耶卡发现,无论k0是多大的四位数, 只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174。

    这就是数学史上著名的“6174猜想”,也称为6174数字黑洞”,以上计算过程称为卡普雷卡尔运算,这个现象称归敛。


     

    当然,这是4个数的情况,当数字个数为3的时候,循环值为495,也是著名的数学黑洞数字。今天我们只要想跟大家说的是如何用C语言验证6174黑洞。

    那这个问题实际上抽象为:任意选一个四位数(数字不能全相同),把所有数字从大到小排列,再把所有数字从小到大排列,用前者减去后者得到一个新的数。重复对新得到的数进行上述操作,7步以内必然会得到6174。

    请用C语言进行验证,并求出经过几次变换得到6174。

    其实与本题类似的情况在浙大PAT中曾经出现过,解决总体思路比较简单,主要涉及排序和数字放入数组进行计算的相关情况,代码我们下面给出一种供大家参考,非唯一解,各位有好的方法可以留言一起交流。

    #include <stdio.h>
    
    int* sort(int number[],int len) //大到小的排序
    
    {
    
      int a =0;
    
      for(int i=0; i<len; ++i)
    
      {
    
        for(int j=i+1;j<len;++j)
    
        {
    
          if(number[i] <number[j])
    
          {
    
            a = number[i];
    
            number[i] = number[j];
    
            number[j] = a;
    
          }
    
        }
    
      }
    
      return number; 
    
    }

     

     

    如果你想深度学习C语言以及高级编程——编程俱乐部【下图进入】!

    涉及到:C语言、C++、windows编程、网络编程、QT界面开发、Linux编程、游戏编程、黑客等等......


     

    程序员编程入门资料:


     

    程序员​推荐学习书籍:


     

    一个活跃、高逼格、高层次的程序员编程学习殿堂;编程入门只是顺带,思维的提高才有价值!


     
    int convert(int number[],int ans)//每次变换得到的数字
    
    {
    
      int *p = NULL;
    
      int m=0;
    
      number[0] = ans/1000;  //把这个数放入数组
    
      number[1] = ans%1000/100;
    
      number[2] = ans%100/10;
    
      number[3] = ans%10;
    
      p = sort(number,4);
    
      m=(*p*1000+*(p+1)*100+*(p+2)*10+*(p+3))- ( *(p+3)*1000+*(p+2)*100+*(p+1)*10+*p);
    
      return m;
    
    }
    
    int main(void)
    
    {
    
      int number[4] = {0};
    
      int *p = NULL;
    
      int n = 0;
    
      int ans = 0;
    
      int count = 0;
    
      printf("请输入一个互不相同的四位数:");
    
      scanf("%d",&n);
    
      printf("%d-",n);
    
      ans = n;
    
      while(ans!=6174)
    
      {
    
        ans = convert(number,ans);
    
        printf("%d-",ans);
    
        ++count;
    
      }
    
      if(6174==ans)
    
        printf("%d
    ",6174);
    
        printf("%d",count);
    
      return 0;
    
    }
  • 相关阅读:
    window.location.href无法跳转的解决办法
    HTTP 错误 405.0
    C# 浅拷贝与深拷贝
    C# .ToString() 格式化
    深入理解AsyncTask
    【转】Android子线程真的不能更新UI么
    深入理解Activity的启动模式
    Android7.0,剪裁后提示“无法保存经过裁剪的图片”
    Android工程改包名
    javah命令,提示“找不到类文件”
  • 原文地址:https://www.cnblogs.com/huya-edu/p/13884900.html
Copyright © 2020-2023  润新知