Java面試之旅——卡不列克常數

今天面試碰到的一題——卡不列克常數,不過我們的要求只是畫出順序圖

 

 

驗證卡布列克運算。任意一個四位數,只要它們各個位上的數字是不全相同的,就有這樣的規律:
1)將組成該四位數的四個數字由大到小排列,形成由這四個數字構成的最大的四位數;
2)將組成該四位數的四個數字由小到大排列,形成由這四個數字構成的最小的四位數(如果四個數中含有0,則得到的數不足四位);
3)求兩個數的差,得到一個新的四位數(高位零保留)。
重複以上過程,最後得到的結果是6174,這個數被稱爲卡布列克數。
*問題分析與算法設計
題目中給出的處理過程很清楚,算法不需要特殊設計,可按照題目的敘述直接進行驗證。
*程序與程序註釋
#include<stdio.h>
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); /*輸入任意正整數*/
vr6174(n); /*調用函數進行驗證*/
}

void vr6174(int num)
{
int each[4],max,min;
if(num!=6174&&num) /*若不等於74且不等於0則進行卡布列克運算*/
{
parse_sort(num,each); /*將整數分解,數字存入each數組中*/
max_min(each,&max,&min); /*求數字組成的最大值和最小值*/
num=max-min; /*求最大值和最小值的差*/
printf("[%d]: %d-%d=%d\n",++count,max,min,num); /*輸出該步計算過程*/
vr6174(num); /*遞歸調用自身繼續進行卡布列克運算*/
}
}
void parse_sort(int num,int *each)
{
int i,*j,*k,temp;
for(i=0;i<=4;i++) /*將NUM分解爲數字*/
{
j=each+3-i;
*j=num%10;
num/=10;
}
for(i=0;i<3;i++) /*對各保數字從小到大進行排序*/
for(j=each,k=each+1;j<each+3-i;j++,k++)
if(*j>*k) { temp=*j;*j=*k;*k=temp;}
return;
}
void max_min(int *each,int *max,int *min) /*將分解的數字還原爲最大整數和最小整數*/
{
int *i;
*min=0;
for(i=each;i<each+4;i++) /*還原爲最小的整數*/
*min=*min*10+*i;
*max=0;
for(i=each+3;i>=each;i--) /*還原爲最大的整數*/
*max=*max*10+*i;
return;
}

*運行結果
1) Enter a number:4312
[1]:4312-1234=3078
[2]:8730-378=8352
[3]:8532-2358=6174
2) Enter a number:8720
[1]:8720-278=8442
[2]:8442-2448=5994
[3]:9954-4599=5355
[4]:5553-3555=1998
[5]:9981-1899=8082
[6]:8820-288=8523
[7]:8532-2358=6174
3)Enter a number:9643
[1]:9643-3469=6174

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章