#include"stdio.h"
#include"stdlib.h"
//函数f(a)是利用递归来计算一个四位数计算到6174所用的次数
int f(int a)
{
int i,j,max,min,cha,temp,num[4]={0}
num[0]=a/1000
num[1]=(a%1000)/100
num[2]=(a%100)/10
num[3]=(a%10)
if (num[1]==num[0] &&num[2]==num[0] &&num[3]==num[0])
return 0 //如果这个4位数的4个数都相同则返回0
for(i=0i<=2i++) //数组中数字按从小到大排序(冒泡排序法)
{
for(j=0j<=2j++)
{
if(num[j]>num[j+1])
{
temp=num[j]
num[j]=num[j+1]
num[j+1]=temp
}
}
}
max=num[3]*1000+num[2]*100+num[1]*10+num[0]//最大值
min=num[0]*1000+num[1]*100+num[2]*10+num[3]//最小值
cha=max-min //最大值与最小值之差
if(cha==6174)//如果差等于6174则返回1
return 1
else
return f(cha)+1 //如果差不等于6174则进行递归,返回f(cha)+1
}
main( )
{
int x,i,temp,maxtimes
int times[10000]={0}//用来存储递归次数,如6174是1次,则times[6174]=1
for(i=1000i<=9999i++)
times[i]=f(i)
maxtimes=times[1000]
temp=1000
for(i=1000i<9999i++)
{
if(times[i]>maxtimes)
{
maxtimes=times[i]
temp=i
}
}
printf("需要计算次数最多的4位数是:%d\n",temp)
printf("%d计算到6174所经过的次数是:%d\n",temp,maxtimes)
system("pause")
}
#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
int 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
",++count,max,min,num) /*输出该步计算过程*/
vr6174(num) /*递归调用自身继续进行卡布列克运算*/
}
}
void parse_sort(int num,int *each)
{
int i,*j,*k,temp
for(i=0i<=4i++) /*将NUM分解为数字*/
{
j=each+3-i
*j=num%10
num/=10
}
for(i=0i<3i++) /*对各保数字从小到大进行排序*/
for(j=each,k=each+1j<each+3-ij++,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=eachi<each+4i++) /*还原为最小的整数*/
*min=*min*10+*i
*max=0
for(i=each+3i>=eachi--) /*还原为最大的整数*/
*max=*max*10+*i
return
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)