编写程序验证卡布列克运算

编写程序验证卡布列克运算,任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:

(1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;

(2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位);

(3)求两个数的差,得到一个新的四位数(高位零保留)。

重复以上过程,最后得到的结果是6174,这个数被称为卡布列克数。

 

#include<stdio.h>

int idigit(int n,int a[4])                 //取得四位数,并按照从大到小的顺序排列
{
    int i=0,j,t;
    for(i=0;i<4;i++)
    {
        a[i] = n % 10;
        n = n / 10;
    }
    for(i=0;i<3;i++)                        //比较四个数(比三次),并从大到小依次存放
        for(j=i+1;j<4;j++)
            if(a[i]<a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    return 1;
}

int getmin(int n)                           //重新生成最小的四位数m
{
    int a[4],i,j,t,m=0;                     //数组;两个循环变量;各位置值t;传递继承值m;
    idigit(n,a);
    for(i=3;i>=0;i--)                       //数组的最小情况(倒着)
    {
        t = 1;
        for(j=0;j<i;j++)                    //循环3+2+1+0=6次
            t *= 10;
        m += t * a[i];
    }
    return m;
}

int getmax(int n)                           //重新生成最大的四位数m
{
    int a[4],i,j,t,m=0;
    idigit(n,a);
    for(i=0;i<4;i++)
    {
        t = 1;
        for(j=0;j<3-i;j++)
            t *= 10;
        m += t * a[i];
    }
    return m;
}
int check(int n){
    int arr[4];
    for(int i=0;i<4;i++){
        arr[i]=n%10;
        n/=10;
    }
    for(int i=0;i<3;i++){
        for(int j=i+1;j<4;j++){
            if(arr[i]==arr[j]){
                return 0;
            }
        }
    }
    return 1;
}
int main()
{
    int n;
    printf("Please enter a four digit number that is not the same as each digit:\n");
    while (1){
        scanf("%d",&n);
        if(n>999&&n<10000&&check(n)){
            break;
        }else{
            printf("illegal input,try again\n");
            fflush(stdin);
        }
    }    while(n!=6174)
    {
        printf("%4d - %4d = %4d\n",getmax(n),getmin(n),getmax(n)-getmin(n));
        n = getmax(n) - getmin(n);
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/jeseesmith/p/12744921.html