83.卡布列克常數(shù)
驗(yàn)證卡布列克運(yùn)算。任意一個四位數(shù),只要它們各個位上的數(shù)字是不全相同的,就有這樣的規(guī)律:
1)將組成該四位數(shù)的四個數(shù)字由大到小排列,形成由這四個數(shù)字構(gòu)成的的四位數(shù);
2)將組成該四位數(shù)的四個數(shù)字由小到大排列,形成由這四個數(shù)字構(gòu)成的最小的四位數(shù)(如果四個數(shù)中含有0,則得到的數(shù)不足四位);
3)求兩個數(shù)的差,得到一個新的四位數(shù)(高位零保留)。
重復(fù)以上過程,最后得到的結(jié)果是6174,這個數(shù)被稱為卡布列克數(shù)。
*問題分析與算法設(shè)計
題目中給出的處理過程很清楚,算法不需要特殊設(shè)計,可按照題目的敘述直接進(jìn)行驗(yàn)證。
*程序與程序注釋
#include
void vr6174(int);
void parse_sort(int num,int *each);
void max_min(int *each,int *max,int *min);
void parse_sort(int num,int *each);
int count=0;
void main()
{
int n;
printf("Enter a number:");
scanf("%d", &n); /*輸入任意正整數(shù)*/
vr6174(n); /*調(diào)用函數(shù)進(jìn)行驗(yàn)證*/
}
void vr6174(int num)
{
int each[4],max,min;
if(num!=6174&&num) /*若不等于74且不等于0則進(jìn)行卡布列克運(yùn)算*/
{
parse_sort(num,each); /*將整數(shù)分解,數(shù)字存入each數(shù)組中*/
max_min(each,&max,&min); /*求數(shù)字組成的值和最小值*/
num=max-min; /*求值和最小值的差*/
printf("[%d]: %d-%d=%d\n",++count,max,min,num); /*輸出該步計算過程*/
vr6174(num); /*遞歸調(diào)用自身繼續(xù)進(jìn)行卡布列克運(yùn)算*/
}
}
void parse_sort(int num,int *each)
{
int i,*j,*k,temp;
for(i=0;i<=4;i++) /*將NUM分解為數(shù)字*/
{
j=each+3-i;
*j=num%10;
num/=10;
}
for(i=0;i<3;i++) /*對各保數(shù)字從小到大進(jìn)行排序*/
for(j=each,k=each+1;j if(*j>*k) { temp=*j;*j=*k;*k=temp;}
return;
}
void max_min(int *each,int *max,int *min) /*將分解的數(shù)字還原為整數(shù)和最小整數(shù)*/
{
int *i;
*min=0;
for(i=each;i *min=*min*10+*i;
*max=0;
for(i=each+3;i>=each;i--) /*還原為的整數(shù)*/
*max=*max*10+*i;
return;
}
*運(yùn)行結(jié)果
1) Enter a number:4312
[1]:4312-1234=3078
[2]:8730-378=8352
[3]:8532-2358=6174
驗(yàn)證卡布列克運(yùn)算。任意一個四位數(shù),只要它們各個位上的數(shù)字是不全相同的,就有這樣的規(guī)律:
1)將組成該四位數(shù)的四個數(shù)字由大到小排列,形成由這四個數(shù)字構(gòu)成的的四位數(shù);
2)將組成該四位數(shù)的四個數(shù)字由小到大排列,形成由這四個數(shù)字構(gòu)成的最小的四位數(shù)(如果四個數(shù)中含有0,則得到的數(shù)不足四位);
3)求兩個數(shù)的差,得到一個新的四位數(shù)(高位零保留)。
重復(fù)以上過程,最后得到的結(jié)果是6174,這個數(shù)被稱為卡布列克數(shù)。
*問題分析與算法設(shè)計
題目中給出的處理過程很清楚,算法不需要特殊設(shè)計,可按照題目的敘述直接進(jìn)行驗(yàn)證。
*程序與程序注釋
#include
void vr6174(int);
void parse_sort(int num,int *each);
void max_min(int *each,int *max,int *min);
void parse_sort(int num,int *each);
int count=0;
void main()
{
int n;
printf("Enter a number:");
scanf("%d", &n); /*輸入任意正整數(shù)*/
vr6174(n); /*調(diào)用函數(shù)進(jìn)行驗(yàn)證*/
}
void vr6174(int num)
{
int each[4],max,min;
if(num!=6174&&num) /*若不等于74且不等于0則進(jìn)行卡布列克運(yùn)算*/
{
parse_sort(num,each); /*將整數(shù)分解,數(shù)字存入each數(shù)組中*/
max_min(each,&max,&min); /*求數(shù)字組成的值和最小值*/
num=max-min; /*求值和最小值的差*/
printf("[%d]: %d-%d=%d\n",++count,max,min,num); /*輸出該步計算過程*/
vr6174(num); /*遞歸調(diào)用自身繼續(xù)進(jìn)行卡布列克運(yùn)算*/
}
}
void parse_sort(int num,int *each)
{
int i,*j,*k,temp;
for(i=0;i<=4;i++) /*將NUM分解為數(shù)字*/
{
j=each+3-i;
*j=num%10;
num/=10;
}
for(i=0;i<3;i++) /*對各保數(shù)字從小到大進(jìn)行排序*/
for(j=each,k=each+1;j
return;
}
void max_min(int *each,int *max,int *min) /*將分解的數(shù)字還原為整數(shù)和最小整數(shù)*/
{
int *i;
*min=0;
for(i=each;i
*max=0;
for(i=each+3;i>=each;i--) /*還原為的整數(shù)*/
*max=*max*10+*i;
return;
}
*運(yùn)行結(jié)果
1) Enter a number:4312
[1]:4312-1234=3078
[2]:8730-378=8352
[3]:8532-2358=6174

