黑洞

本文介绍了一个有趣的数学现象——数字黑洞循环,并提供了一段C++代码来探索5位数的所有可能循环圈。通过计算任意5位数经过特定操作后的循环序列,展示了如何使用简单的排序和数学运算实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。
求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

  请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
 
 循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
*/
#include<iostream.h>
#include<stdio.h>
#include<string>
using namespace std;

void sort(int * p)
{ //升序排列

 int temp=0;
 for(int i=0;i<5;i++)
  for(int j=0;j<4;j++)
   if(p[j]>p[j+1])
   {
    temp=p[j];
                p[j]=p[j+1];
    p[j+1]=temp;
   }
}

 int  maxNum(int *p)
 {
  int maxNum=0;
  for (int i=4;i>=0;i--)
  {  
   maxNum=maxNum*10+p[i];
  }
  return maxNum;
 }
 int minNum(int *p)
 { 
      int minNum=0;
   for (int i=0;i<=4;i++)
   {  
    minNum=minNum*10+p[i];
  }
  return minNum;
 
 }

 int f(int n)
 {
     int t[5];
  for(int i=0;i<5;i++)
  {
   t[i]=n%10;
   n=n/10;
  }
  cout<<endl;
  sort(t);
  //转为数字 最大数 最小数
 
  //求差
  n=maxNum(t)-minNum(t);
     // cout<<n<<endl;
  return n;
 }
int jianyan(int *a,int n)
{

 int i,j;
 //int flag=1;
 for (i=0;i<n;i++)
 {
  for (j=i+1;j<n;j++)
  {
   if (a[i]==a[j])
   {
   // flag=0;
                  return i;
    //break;
   }
  }
 }
 return 0;
}

int main()
{


 int n;
 int jieguo[100]={0};
 cin>>n;

 int m=0;
 while (1)
 {
  jieguo[m++]=n=f(n);
 // printf("%d\n",m); 
  //共M个
  if (jianyan(jieguo,m)!=0)
  break;
 }
  //输出
 printf("[");
 for (int i=jianyan(jieguo,m);i<m-2;i++)
 {
  printf("%d,",jieguo[i]);
 
 }
 printf("%d]\n",jieguo[m-2]);
 
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值