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

#include <stdio.h>
#include <math.h>

#define N 4
int GetMax( int a[]);
int GetMin( int a[]);
int check(int n);
int idigit(int n,int a[]);
void is_kabulek(int *n);
int GetNum();


int main() {
    int n;
    n=GetNum();
   is_kabulek(&n);
    return 0;
}
int GetMax( int a[]){
    int i,result=0;
    for (i = 0; i < N; i++) {
        result+=a[i]*pow(10,N-i-1);
    }
    return result;
}
int GetMin( int a[]){
    int i,result=0;
    for (i = 0; i < N; i++) {
        result+=a[i]*pow(10,i);
    }
    return result;
}
int check(int n){
    int arr[N],count=0;
    for(int i=0;i<N;i++){
        arr[i]=n%10;
        n/=10;
    }
    for(int i=0;i<N-1;i++){
        for(int j=i+1;j<N;j++){
            if(arr[i]==arr[j]){
                count++;
            }
        }
    }
    if(count>3){
        return 0;
    }
        return 1;
}
int idigit(int n,int a[]){
    int i,j,t;
    for(i=0;i<N;i++){
        a[i]=n%10;
        n/=10;
    }
    for(i=0;i<N-1;i++){
        for(j=i+1;j<N;j++){
            if(a[i]<a[j]){
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }

        }
    }
    return 0;

}
void is_kabulek(int *n){
    int a[N];
    idigit(*n,a);
    while(*n!=6174&&*n) {
        printf("%4d - %4d = %4d
",GetMax(a),GetMin(a),GetMax(a)-GetMin(a));
        *n = GetMax( a) - GetMin( a);
        idigit(*n,a);
    }
}
int GetNum() {
    int n;
    printf("input a four-digit number that is not the same as each digit
");
    while (1) {
        scanf("%d", &n);
        if (n > 999 && n < 10000 && check(n)) {
            break;
        } else {
            printf("illegal input,try again
");
            fflush(stdin);
        }

    }
    return n;
}

  

#include <stdio.h>
#include <math.h>
const int N=4;
int GetMax( int n);
int GetMin( int n);
int check(int);
int idigit(int n,int a[N]);


int main() {
    int n;
    printf("input a four-digit number that is not the same as each digit
");
    while (1){
        scanf("%d",&n);
        if(n>999&&n<10000&&check(n)){
            break;
        }else{
            printf("illegal input,try again
");
            fflush(stdin);
        }
    }
    while(n!=6174&&n) {
    printf("%4d - %4d = %4d
",GetMax(n),GetMin(n),GetMax(n)-GetMin(n));
    n = GetMax(n) - GetMin(n);
    }
    return 0;
}
int GetMax( int n){
    int a[N],i,result=0;
    idigit(n,a);
    for (i = 0; i < N; i++) {
        result+=a[i]*pow(10,N-i-1);
    }
    return result;
}
int GetMin( int n){
    int a[N],i,j,t,result=0;
    idigit(n,a);
    for (i = 0; i < N; i++) {
        result+=a[i]*pow(10,i);
    }
    return result;
}
int check(int n){
    int arr[N],count=0;
    for(int i=0;i<N;i++){
        arr[i]=n%10;
        n/=10;
    }
    for(int i=0;i<N-1;i++){
        for(int j=i+1;j<N;j++){
            if(arr[i]==arr[j]){
                count++;
            }
        }
    }
    if(count>3){
        return 0;
    }
        return 1;
}
int idigit(int n,int a[N]){
    int i,j,t;
    for(i=0;i<N;i++){
        a[i]=n%10;
        n/=10;
    }
    for(i=0;i<N-1;i++){
        for(j=i+1;j<N;j++){
            if(a[i]<a[j]){
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }

        }
    }
    return 1;

}

  

  

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

(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:
");
    while (1){
        scanf("%d",&n);
        if(n>999&&n<10000&&check(n)){
            break;
        }else{
            printf("illegal input,try again
");
            fflush(stdin);
        }
    }    while(n!=6174)
    {
        printf("%4d - %4d = %4d
",getmax(n),getmin(n),getmax(n)-getmin(n));
        n = getmax(n) - getmin(n);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/jeseesmith/p/12744921.html