zoukankan      html  css  js  c++  java
  • 全国软件专业人才开发与设计赛题之中等题“五位数黑洞”

    2.1由任意的五位数,比如:72962,对此五位数的五个数字进行排序,组成最大的数A,最小的数B,然后求其差C,

    那么我们称next(A)-->C,以此递推,当五位数不足5位,前面补0 ,最终每个五位数均会进入一种循环圈中,这种循环圈成为“五位黑洞”

    特殊的当五位数所有数字相同时,输出[0] 

    求解所有的五位黑洞

    版权声明版权归作者WeiSteven所有,转载请注明! 

    输出格式为:

    [_,_,_,_,]

    每行一个圈

      1 #include <stdio.h>
      2 #include <string.h>
      3 
      4 //构造位运算结构
      5 //目的是减少内存占用
      6 //由于数据是五位数,所以按照位操作100000/8=12500,所以对应于12500即可
      7 char bit[12501];//用于记录数据,用bit来进行记录,1代表之前测试过这个数,但不一定输出过
      8 char bitPrintf[12501];//1代表以及输出
      9 char bitCurr[12501];//代表本次扩展访问的数的标注
     10 
     11 //设置bitCurr中的对应的位
     12 void setcbit(long t)//纪录t位
     13 {
     14     bitCurr[t>>3]|=(0x01<<(t&0x07));
     15 }
     16 
     17 //取得bitCurr标记中的对应t的那位状态
     18 int getcbit(long t)
     19 {
     20     int arrindex=t>>3;
     21     int ch=0x01<<(t&0x07);
     22     if(bitCurr[arrindex]&(ch))//这是取得t/8对应的char 的第t%8位数据
     23         return 1;
     24     else
     25         return 0;
     26 }
     27 
     28 //设置bitPrint中的对应的位
     29 void setbit(long t)//纪录t位
     30 {
     31     bit[t>>3]|=(0x01<<(t&0x07));
     32 }
     33 
     34 //取得标记中的对应t的那位状态
     35 int getbit(long t)
     36 {
     37     int arrindex=t>>3;
     38     int ch=0x01<<(t&0x07);
     39     if(bit[arrindex]&(ch))//这是取得t/8对应的char 的第t%8位数据
     40         return 1;
     41     else
     42         return 0;
     43 }
     44 
     45 void setpbit(long t)//纪录t位
     46 {
     47     bitPrintf[t>>3]|=(0x01<<(t&0x07));
     48 }
     49 
     50 //取得标记中的对应t的那位状态
     51 int getpbit(long t)
     52 {
     53     int arrindex=t>>3;
     54     int ch=0x01<<(t&0x07);
     55     if(bitPrintf[arrindex]&(ch))//这是取得t/8对应的char 的第t%8位数据
     56         return 1;
     57     else
     58         return 0;
     59 }
     60 
     61 
     62 //函数对num所能排列成的任何数据进行标记
     63 //如若已经出现过,则返回0,否则返回1
     64 int setFlag(long num)
     65 {
     66     return 1;
     67 }
     68 
     69 //排序,对分离的五位数字进行排序
     70 void sort(int *b)
     71 {
     72     int t;
     73     for(int i=0;i<5;i++)
     74     {
     75         for(int j=i+1;j<5;j++)
     76         {
     77             if(b[i]<b[j])
     78             {
     79                 t=b[i];
     80                 b[i]=b[j];
     81                 b[j]=t;
     82             }
     83         }
     84     }
     85 }
     86 
     87 /*---------------------------
     88 根据当前的数据t,得到下一个数据
     89 ----------------------------*/
     90 long getNextNumber(long t)
     91 {
     92     int b[5];
     93     for(int i=0;i<5;i++)
     94     {
     95         b[i]=t%10;
     96         t/=10;
     97     }
     98     sort(b);
     99     long maxNum=b[0]*10000+b[1]*1000+b[2]*100+b[3]*10+b[4];
    100     long minNum=b[4]*10000+b[3]*1000+b[2]*100+b[1]*10+b[0];
    101     return maxNum-minNum;
    102 }
    103 
    104 //通过给定的一个数,可以搜索所有可以生成的数,并判断是否进入了五位圈
    105 void findCyle(long t)
    106 {
    107     memset(bitCurr,0,sizeof(bitCurr));
    108     while(getbit(t)==0)//找到下一个数
    109     {
    110         setbit(t);
    111         setcbit(t);
    112         t=getNextNumber(t);
    113     }
    114     if(getcbit(t)==1 && getpbit(t)==0)//这次访问,还没输出过,进入循环判断输出阶段
    115     {
    116         setpbit(t);
    117         printf("[%ld",t);
    118         while(1)//找到下一个数
    119         {
    120             t=getNextNumber(t);
    121             if(getpbit(t)==0)
    122             {
    123                 setpbit(t);
    124                 printf(",%ld",t);
    125             }
    126             else
    127             {
    128                 printf("]\n");
    129                 break;
    130             }
    131         }
    132     }
    133 }
    134 
    135 
    136 int main()
    137 {
    138     memset(bit,0,sizeof(bit));//清空数据
    139     //考虑到时间复杂度,对特殊数据进行了特殊处理
    140     setpbit(11111);
    141     setpbit(22222);
    142     setpbit(33333);
    143     setpbit(44444);
    144     setpbit(55555);
    145     setpbit(66666);
    146     setpbit(77777);
    147     setpbit(88888);
    148     setpbit(99999);
    149     setbit(11111);
    150     setbit(22222);
    151     setbit(33333);
    152     setbit(44444);
    153     setbit(55555);
    154     setbit(66666);
    155     setbit(77777);
    156     setbit(88888);
    157     setbit(99999);
    158     //设置形同的数不进行判断
    159     //printf("%ld\n",getNextNumber(82962));
    160 
    161     printf("[0]\n");
    162     
    163     for(long i=10000;i<100000;i++)
    164     {
    165         if(getbit(i)==0)//表明这个数还没进入任何一个圈,要进行判断
    166         {
    167             findCyle(i);
    168         }
    169     }
    170     
    171     return 1;
    172 }
  • 相关阅读:
    流的创建复制文件
    面试题
    异常
    多态
    继承
    【java】:Junit
    【Java】:ehcache
    【Java】:压缩成多个压缩卷
    【java】:常用工具类
    【javascript】:Highcharts实战
  • 原文地址:https://www.cnblogs.com/weisteve/p/1804890.html
Copyright © 2011-2022 走看看