求大神帮忙:编写一个程序:对任意4个数字,由这4个数字组成的最大4位数减去最小4位数,对结果(如果不足4位数的,加0凑足4位)进行同样的操作,直到这4个数字的组合不再变化为止。要求用递归函数实现,并输出所有可能的4个数字组合。
先附上图片,程序在下面:
#include <stdio.h>
int main()
{
void f1(int x[],int n);
int i,a[4];
printf("请输入4个整数:");
for (i=0;i<4;i++)
scanf("%d",&a[i]);
f1(a,4);
return 0;
}
void f1(int x[],int n)
{
int temp;
int i=0,j=0,y=0,z=0,num=0;
static last=0;
for(;j<3;j++)
for(;i<3-j;i++)
if (x[i]>x[i+1])
{temp=x[i];x[i]=x[i+1];x[i+1]=temp;}
for(i=0;i<4;i++)
{ y=10*y+x[3-i];
z=10*z+x[i];
}
num=y-z;
printf("最大值=%d,最小值=%d,相减后=%d\n",y,z,num);
if(num!=last)
{ last=num;
for(i=0;i<4;i++)
{ x[i]=num%10;num/=10; }
f1(x,4); //这里是条件递归,if成立则调用自身函数。
}
}
追答已写,那个问题用指针变量指向函数地址就ok了。
记得采纳,亲。
1、使用c-free5的标准c写一个经典示例如下:
#include <stdio.h>int main()
{
printf("Hello world!\n");
}
2、此程序向dos或控制台窗口输出Hello world!
#include "conio.h"
void swap(int *m,int *n){
int x;
x=*m;*m=*n;*n=x;
}
int chuli(int x){
int a[4],n=x;
int i,j,max=0,min=0;
n=(n>0)?n:-n;
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]) swap(&a[i],&a[j]);
for(i=0;i<4;i++){
max=max*10+a[i];
min=min*10+a[3-i];
}
if (max-min==x)
return(x);
else
return(chuli(max-min));
}
main()
{
int i,k=0;
int tongji[10000];
for(i=0;i<10000;i++) tongji[i]=0;
for(i=0;i<10000;i++)
tongji[chuli(i)]=1;
for(i=1000;i<10000;i++)
if(tongji[i]==1){
printf("%5d",i);
k=k+1;
if (k%10==0) printf("\n");
}
getch();
}追问
为什么运行结果始终是6174,而不是一组数字呢?
追答因为只有一个组合,没有其它组合了,
如果从0开始,那么有2个,一个是0 另一个就是6174