1019

作者: 笔墨流年乱浮生 | 来源:发表于2018-09-07 13:47 被阅读0次

    //1019 数字黑洞(20 分)
    //给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。
    //
    //例如,我们从6767开始,将得到
    //
    //7766 - 6677 = 1089
    //9810 - 0189 = 9621
    //9621 - 1269 = 8352
    //8532 - 2358 = 6174
    //7641 - 1467 = 6174
    //... ...
    //现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
    //
    //输入格式:
    //输入给出一个 (0,10^4 ) 区间内的正整数 N。
    //
    //输出格式:
    //如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。
    //
    //输入样例 1:
    //6767
    //输出样例 1:
    //7766 - 6677 = 1089
    //9810 - 0189 = 9621
    //9621 - 1269 = 8352
    //8532 - 2358 = 6174
    //输入样例 2:
    //2222
    //输出样例 2:
    //2222 - 2222 = 0000
    //非递增排序就是允许有重复数字的情况下递减排序

    C:

    #include <stdio.h>
    #include <stdlib.h>
    int function(int n);
    int cmp1(const void * a,const void *b);
    int cmp2(const void * a,const void *b);
    int main(int argc, const char * argv[]) {
        int N;
        scanf("%d", &N);
        while (1) {
            N = function(N);
            if (N == 0 || N == 6174) {
                break;
            }
        }
        return 0;
    }
    
    int function(int n)
    {
        int array1[4] = {n/1000, n%1000/100, n%100/10, n%10};//把整数转换到数组中,方便后面qsort的使用
        int array2[4] = {n/1000, n%1000/100, n%100/10, n%10};//把整数转换到数组中,方便后面qsort的使用
        qsort(array1, 4, sizeof(int), cmp1);//qsort(排序的数组地址,数组长度,数据类型大小,用于对比的函数)
        qsort(array2, 4, sizeof(int), cmp2);//qsort(排序的数组地址,数组长度,数据类型大小,用于对比的函数)
        int num1 = array2[0] * 1000 + array2[1] * 100 + array2[2] * 10 +array2[3];
        int num2 = array1[0] * 1000 + array1[1] * 100 + array1[2] * 10 +array1[3];
        n = num1 - num2;
        printf("%04d - %04d = %04d\n", num1, num2,n);
        return n;
    }
    
    int cmp1(const void * a,const void *b)
    {
        return *(int*)a - *(int*)b;
    }//减序排列
    
    int cmp2(const void * a,const void *b)
    {
        return *(int*)b - *(int*)a;
    }//增序排列
    

    思路:N先减序排列,再增序排列,两者相减,重复此步骤
    1.递归思想
    2.循环结束条件是N = 6174或0
    3.qsort(数组地址,数组大小,数据类型大小,比较函数)
    4.增序和减序就是倒序一下,简便一点的方法就是把比较函数里倒一下

    相关文章

      网友评论

          本文标题:1019

          本文链接:https://www.haomeiwen.com/subject/vfkcgftx.html