关于数学黑洞6174(c程序)拜托各位大神

关于数学黑洞6174(c程序)拜托各位大神,第1张

问题出在这一步: for(j=0j<=3j++) { a[j]=s%10s=s%10} 你没理解求余符号的运算结果。 假如这里s = 1234 , 那么第一次循环,a[0] = 1234 % 10 = 4s = 1234 % 10 = 4 那么这个循环接下来还有作用吗? 数组a的元素都是4. 当然对于输入数组的范围要求也有问题,因为题目要求的是各位数字各不相同,而你的判断语句if((n%1111==0)&&(n>9999)&&(n<1000)) 是没有任何功能的,因为哪会有一个整数既大于9999又小于1000呢? 还有下面对数组的排列,有太多方法,每一种都比你的简单。试想,如果这个不是4位数,而是40位,你这种写法,那岂不是能写出几千行的程序?

//程序结果:计算次数最多的4位数是1004,计算次数为7

#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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11493344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存