#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;
}
