蓝桥杯:求一个五位数的数字循环黑洞[快速排序]

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

 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

 请编写程序,输出一个5位数的循环圈,若5位数全都相同则循环圈为 [0]。循环圈的输出格式仿照:

 [82962, 75933, 63954, 61974]

算法实现 

void digitBlackHole(int n) {
    int digit[5],loop[5],i,maxdigit,mindigit;
    if (n%11111) {      //判断五位数是否全部相同
        for (i=0; i<5; i++) {
            
            digit[0]=n/10000;       //分别计算各数位数字
            digit[1]=(n%10000)/1000;
            digit[3]=(n%100-n%10)/10;
            digit[2]=(n%1000-digit[3]*10-n%10)/100;
            digit[4]=n%10;
            
            quickSort(digit, 0, 4);     //从小到大排序
            
            maxdigit=digit[0]+digit[1]*10+digit[2]*100+digit[3]*1000+digit[4]*10000;
            mindigit=digit[0]*10000+digit[1]*1000+digit[2]*100+digit[3]*10+digit[4];
            loop[i]=maxdigit-mindigit;      //取重排列最大差值
            n=loop[i];      //循环求值
        }
        printf("[%d, %d, %d, %d]\n\n",loop[1],loop[2],loop[3],loop[4]);     //首数非循环圈数值
    } else {
        printf("[0]\n\n");      //五位数相同输出[0]
    }
}

void quickSort(int a[],int low,int high) {      //快速排序
    int mid=a[low],t,l=low,r=high;
    if (low>=high) {
        return;
    }
    while (low<high) {
        if (a[high]<a[low]) {
            
            t=a[high];
            a[high]=a[low];
            a[low]=t;
        }
        if (mid==a[low]) {
            high--;
        } else {
            low++;
        }
    }
    quickSort(a, l, low-1);     //递归
    quickSort(a, low+1, r);
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值