5位数字黑洞C源码

来源:互联网 发布:中国地图绘制软件 编辑:程序博客网 时间:2024/06/06 11:49

**********************************************
###任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:
###65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程
###(如果不足5位,则前边补0)。如此往复,数字会
###落入某个循环圈(称为数字黑洞)。
###请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。
其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
###[82962, 75933, 63954, 61974]
###个人百度空间http://hi.baidu.com/zjcjava

### author:zjcjav
###
*************************************************/
#include<stdio.h>
#include <stdlib.h>

//排序
void  sortNum(int * oldNum,int * bigNum)
{// printf("/n  sort方法:");
 int temp=0;
 for(int i=0; i<5;i++)
 {
  
  for(int j=0;j<4;j++)
   if(oldNum[j]>oldNum[j+1])
   { temp=oldNum[j+1];
    oldNum[j+1]=oldNum[j];
    oldNum[j]=temp;

   } 
  
 }

 for(int k=0;k<5;k++)
 {
  bigNum[k]=oldNum[4-k];
 // printf("%d",bigNum[k]);
 
 }
// printf("/n");
}

 

 

//转为数字

int  arrytoInt(int * arry)
{
 int  number;
 number=arry[0]*10000+arry[1]*1000+arry[2]*100+arry[3]*10+arry[4];
 return  number;
}

 

//heidong
int  blackHol(int dig,int * allAnsw,int ans)
{
 int  subSort[100] ,inNum[5] ,bigNum[5];
 int i=0, start=0;
  while(dig)
 {
  
  for (int j=0; j<5; j++)
   {
   
  inNum[j] = dig %10; // 将数字保存在数组中
  dig= (dig-dig % 10)/10;
 // printf("%d+++",num);
 // printf("%d+++",inNum[j]);
   }
   //printf("/n  sort方法:");
 sortNum(inNum,bigNum);
 subSort[i]=arrytoInt(bigNum)-arrytoInt(inNum);
// printf("%d-%d=%d/n",arrytoInt(bigNum),arrytoInt(inNum),subSort[i]);

 if(i==0) dig=subSort[i];//当开始时不会进入循环;因此要手动赋值

 for(int m=0; m<i;m++)
  {// printf("subsort方法第%d%d次,subSort:%d/n",i,m,subSort[i]);
   dig=subSort[i];//并把差赋给寻控制循环的big
   if(subSort[m]==subSort[i])//找到循环圈
   {
    int isAs=0;
    start=m;//把下标赋给开始的值
   // printf("%d/n",m);
    for(int n=0;n<ans;n++)
    { 
     if(allAnsw[n]==subSort[start])
     isAs++;
    } 
    if(isAs==0)//和以前的答案作比较,不同则输出
    {
     allAnsw[ans++]=subSort[start];//把每个圈的开始数存入,
     printf("[");//输出结果
    for(;start<i;start++)
     printf("%d  ,",subSort[start]);
    printf("]/n");
    break;
    }
   }
 
  }
  //if(start!=0) break;//控制外循环结束
  if(start!=0) break;
  i++;
 // printf("输出i的值%d/n",i);
 
 }
 
return  ans;
}

 

void main()
{
 int num, allAnsw[100]={0},ans=0;//数字,答案集合,答案个数
 printf("*****************************************************************************/n");
 printf("输入一个各个位都不相等的五位数如:(34256)!/n");
 printf("任意一个5位数,把它的各位数字重新排列,可以得到一个最大的数:一个最小的数。/n");
 printf("求这两个数字的差,得:41976,把这个数字再次重复上述过程。如此往复,数字会/n");
 printf("得到一个循环圈,求出所有五位数的所有可能循环———————————/n");
 printf("*****************************************************************************/n");
 printf("*********************                 原题出自2011国信蓝点c语言题目    ******/n");
 printf("*********************                 zjcjava完成于2011.4月            ******/n");
 printf("*****************************************************************************/n/n");
 printf("所有情况如下:/n");
//sortNum(inNum,littNum);
 for(num=10000;num<=99998;num++)
 {
  int dig=num;
  
 // printf("%d---",num);
  if(num%11111==0)
   continue;
 
  else
  {
  //调用
 // int dig=34256;
 ans=blackHol(dig,allAnsw,ans);//答案的个数返回

/***********************************************************/
/*  int  subSort[100]  ,inNum[5] ,bigNum[5];
  int start=0,i=0, j=0;;
  while(dig)
  {

   printf("这是第%d次循环dig:%d---",i,dig);
  for (int j=0; j<5; j++)
   {
   
  inNum[j] = dig %10; // 将数字保存在数组中
  dig= (dig-dig % 10)/10;
 // printf("%d+++",num);
 // printf("%d+++",inNum[j]);
   }
   //printf("/n  sort方法:");
 sortNum(inNum,bigNum);
 subSort[i]=arrytoInt(bigNum)-arrytoInt(inNum);
 printf("%d-%d=%d/n",arrytoInt(bigNum),arrytoInt(inNum),subSort[i]);
    if(i==0) dig=subSort[i];
 for(int m=0; m<i;m++)
  {
 printf("subsort方法第%d%d次,subSort:%d/n",i,m,subSort[i]);
   dig=subSort[i];
   if(subSort[m]==subSort[i])
   {
    start=m;
    printf("%d/n",m);
    printf("[");//输出结果
    for(;start<i;start++)
     printf("%d  ,",subSort[start]);
    printf("]/n");
    break;
   }
   
  
  }


  if(start!=0) break;
  i++;

  }*/


 /******************************************************/

  }
 }
 printf("所有循环圈的开始值:/n");
 for(int n=0;n<ans;n++)
 printf("%d/t",allAnsw[n]);
}

 

 

/*****************以上是我写的过程,在vc下可以正常运行,虽然结果有仍然有重复的部分,各位可以再做改进**********/

原创粉丝点击