读书人

真的值得一看,哪位高手能帮小弟我看看

发布时间: 2012-04-15 18:39:21 作者: rapoo

真的值得一看,谁能帮我看看到底是哪错了,万分感谢!
[code=C/C++][/code]
问题:任取一个四位数,只要四个数字不全相同,按数字递减顺序排列,构成最大数作为被减数;按数字递增顺序排列,构成最小数作为减数,其差就会得6174;如不是6174,则按上述方法再作减法,至多不过10步就必然得到6174。
  如取四位数5679,按以上方法作运算如下:
  9765-5679=4086 8640-4068=4572 7542-2457=5085
  8550-5058=3492 9432-2349=7083 8730-3078=5652
  6552-2556=3996 9963-3699=6264 6642-2466=4176
  7641-1467=6174
我调用系统函数qsort()排序,结果却是错误,哪位高手帮忙看下,谢了!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
int cmp1(const void *,const void *);
int cmp2(const void *,const void *);
char *a;
a=(char *)malloc(4);
int num;
int ma;
int mi;
int i;
scanf("%d",&num);
for( i=1;i<=10;i++)
{
itoa(num,a,10);
qsort(a,strlen(a),1,cmp1);
ma=atoi(a);
qsort(a,strlen(a),1,cmp2);
mi=atoi(a);
num=ma-mi;
if(num==6174) break;
printf("%d-%d=%d\n",ma,mi,num);

}

}
int cmp1(const void *a,const void *b)
{
if((*(char *)a-*(char *)b)>0)
return 1;
if((*(char *)a-*(char *)b)==0)
return 0;
return -1;
}
int cmp2(const void *a,const void *b)
{
if(((char *)a-(char *)b)>0)
return -1;
if(((char *)a-(char *)b)==0)
return 0;
return 1;
}

[解决办法]
嗯,可以了。是挺好玩:

3721
7321-1237=6084
8640-468=8172
8721-1278=7443
7443-3447=3996
9963-3699=6264
6642-2466=4176
7641-1467=6174
ok,find it!
请按任意键继续. . .
[解决办法]
全代码:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
int cmp1(const void *,const void *);
int cmp2(const void *,const void *);
char a[5]={0};

int num;
int ma;
int mi;
int i;
scanf("%d",&num);

for( i=1;i<=10;i++)
{
itoa(num,a,10);
int ntest=strlen(a);
qsort(a,4,1,cmp2);
ma=atoi(a);
qsort(a,4,1,cmp1);
mi=atoi(a);
num=ma-mi;
printf("%d-%d=%d\n",ma,mi,num);
if(num==6174) break;


}

}
int cmp1(const void *a,const void *b)
{
if((*(char *)a-*(char *)b)>0)
return 1;
if((*(char *)a-*(char *)b)==0)
return 0;
return -1;
}
int cmp2(const void *a,const void *b)
{
if((*(char *)a-*(char *)b)>0)
return -1;
if((*(char *)a-*(char *)b)==0)
return 0;
return 1;
}
[解决办法]
卡布列克常数, 不是10步,是7步。

读书人网 >C语言

热点推荐