**********************************************
###任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:
###65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程
###(如果不足5位,则前边补0)。如此往复,数字会
###落入某个循环圈(称为数字黑洞)。
###请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。
其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
###[82962, 75933, 63954, 61974]
###个人百度空间http://hi.baidu.com/zjcjava
### author:zjcjav
###
*************************************************/
#include<stdio.h>
#include <stdlib.h>
//排序
void sortNum(int * oldNum,int * bigNum)
{// printf("/n sort方法:");
int temp=0;
for(int i=0; i<5;i++)
{
for(int j=0;j<4;j++)
if(oldNum[j]>oldNum[j+1])
{ temp=oldNum[j+1];
oldNum[j+1]=oldNum[j];
oldNum[j]=temp;
}
}
for(int k=0;k<5;k++)
{
bigNum[k]=oldNum[4-k];
// printf("%d",bigNum[k]);
}
// printf("/n");
}
//转为数字
int arrytoInt(int * arry)
{
int number;
number=arry[0]*10000+arry[1]*1000+arry[2]*100+arry[3]*10+arry[4];
return number;
}
//heidong
int blackHol(int dig,int * allAnsw,int ans)
{
int subSort[100] ,inNum[5] ,bigNum[5];
int i=0, start=0;
while(dig)
{
for (int j=0; j<5; j++)
{
inNum[j] = dig %10; // 将数字保存在数组中
dig= (dig-dig % 10)/10;
// printf("%d+++",num);
// printf("%d+++",inNum[j]);
}
//printf("/n sort方法:");
sortNum(inNum,bigNum);
subSort[i]=arrytoInt(bigNum)-arrytoInt(inNum);
// printf("%d-%d=%d/n",arrytoInt(bigNum),arrytoInt(inNum),subSort[i]);
if(i==0) dig=subSort[i];//当开始时不会进入循环;因此要手动赋值
for(int m=0; m<i;m++)
{// printf("subsort方法第%d%d次,subSort:%d/n",i,m,subSort[i]);
dig=subSort[i];//并把差赋给寻控制循环的big
if(subSort[m]==subSort[i])//找到循环圈
{
int isAs=0;
start=m;//把下标赋给开始的值
// printf("%d/n",m);
for(int n=0;n<ans;n++)
{
if(allAnsw[n]==subSort[start])
isAs++;
}
if(isAs==0)//和以前的答案作比较,不同则输出
{
allAnsw[ans++]=subSort[start];//把每个圈的开始数存入,
printf("[");//输出结果
for(;start<i;start++)
printf("%d ,",subSort[start]);
printf("]/n");
break;
}
}
}
//if(start!=0) break;//控制外循环结束
if(start!=0) break;
i++;
// printf("输出i的值%d/n",i);
}
return ans;
}
void main()
{
int num, allAnsw[100]={0},ans=0;//数字,答案集合,答案个数
printf("*****************************************************************************/n");
printf("输入一个各个位都不相等的五位数如:(34256)!/n");
printf("任意一个5位数,把它的各位数字重新排列,可以得到一个最大的数:一个最小的数。/n");
printf("求这两个数字的差,得:41976,把这个数字再次重复上述过程。如此往复,数字会/n");
printf("得到一个循环圈,求出所有五位数的所有可能循环———————————/n");
printf("*****************************************************************************/n");
printf("********************* 原题出自2011国信蓝点c语言题目 ******/n");
printf("********************* zjcjava完成于2011.4月 ******/n");
printf("*****************************************************************************/n/n");
printf("所有情况如下:/n");
//sortNum(inNum,littNum);
for(num=10000;num<=99998;num++)
{
int dig=num;
// printf("%d---",num);
if(num%11111==0)
continue;
else
{
//调用
// int dig=34256;
ans=blackHol(dig,allAnsw,ans);//答案的个数返回
/***********************************************************/
/* int subSort[100] ,inNum[5] ,bigNum[5];
int start=0,i=0, j=0;;
while(dig)
{
printf("这是第%d次循环dig:%d---",i,dig);
for (int j=0; j<5; j++)
{
inNum[j] = dig %10; // 将数字保存在数组中
dig= (dig-dig % 10)/10;
// printf("%d+++",num);
// printf("%d+++",inNum[j]);
}
//printf("/n sort方法:");
sortNum(inNum,bigNum);
subSort[i]=arrytoInt(bigNum)-arrytoInt(inNum);
printf("%d-%d=%d/n",arrytoInt(bigNum),arrytoInt(inNum),subSort[i]);
if(i==0) dig=subSort[i];
for(int m=0; m<i;m++)
{
printf("subsort方法第%d%d次,subSort:%d/n",i,m,subSort[i]);
dig=subSort[i];
if(subSort[m]==subSort[i])
{
start=m;
printf("%d/n",m);
printf("[");//输出结果
for(;start<i;start++)
printf("%d ,",subSort[start]);
printf("]/n");
break;
}
}
if(start!=0) break;
i++;
}*/
/******************************************************/
}
}
printf("所有循环圈的开始值:/n");
for(int n=0;n<ans;n++)
printf("%d/t",allAnsw[n]);
}
/*****************以上是我写的过程,在vc下可以正常运行,虽然结果有仍然有重复的部分,各位可以再做改进**********/