2011软件设计大赛题(三)

2014-11-24 03:14:03 · 作者: · 浏览: 10
e (gc1.before(gc2)) {

gc1.add(Calendar.DATE, 1);

elapsed++;

}

return elapsed;

}

public void main(String[] args) {

Calendar cal = Calendar.getInstance();

GregorianCalendar gc1 = new GregorianCalendar(2009, Calendar.JANUARY, 1);

GregorianCalendar gc2 = new GregorianCalendar(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH), cal.get(Calendar.DATE));

int days= getDays(gc1, gc2);

System.out.println(days);

}

10. 程序设计(满分20分)

任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。

比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为[0],这个可以不考虑。循环圈的输出格式仿照:

[82962, 75933, 63954, 61974]

其中数字的先后顺序可以不考虑。

#include

#include

#include

//构造位运算结构。

//目的是减少内存占用。

//由于数据是五位数,所以按照位操作100000/8=12500,所以对应于12500即可。

char bit[12501];//用于记录数据,用bit来进行记录,1代表之前测试过这个数,但不一定输出过。

char bitPrintf[12501];//1代表以及输出。

char bitCurr[12501];//代表本次扩展访问的数的标注。

//设置bitCurr中的对应的位。

void setcbit(long t)//纪录t位

{

bitCurr[t>>3]|=(0x01<<(t&0x07));

}

//取得bitCurr标记中的对应t的那位状态

int getcbit(long t)

{

int arrindex=t>>3;

int ch=0x01<<(t&0x07);

if(bitCurr[arrindex]&(ch))//这是取得t/8对应的char的第t%8位数据

return 1;

else

return 0;

}

//设置bitPrint中的对应的位

void setbit(long t)

{

bit[t>>3]|=(0x01<<(t&0x07));

}

//取得标记中的对应t的那位状态

int getbit(long t)

{

int arrindex=t>>3;

int ch=0x01<<(t&0x07);

if(bit[arrindex]&(ch))//这是取得t/8对应的char 的第t%8位数据

return 1;

else

return 0;

}

void setpbit(long t)//纪录t位

{

bitPrintf[t>>3]|=(0x01<<(t&0x07));

}

//取得标记中的对应t的那位状态

int getpbit(long t)

{

int arrindex=t>>3;

int ch=0x01<<(t&0x07);

if(bitPrintf[arrindex]&(ch))//这是取得t/8对应的char 的第t%8位数据

return 1;

else

return 0;

}

//函数对num所能排列成的任何数据进行标记

//如若已经出现过,则返回0,否则返回1

int setFlag(long num)

{

return 1;

}

//排序,对分离的五位数字进行排序

void sort(int *b)

{

int t;

for(int i=0;i<5;i++)

{

for(int j=i+1;j<5;j++)

{

if(b[i]

{

t=b[i];

b[i]=b[j];

b[j]=t;

}

}

}

}

//根据当前的数据t,得到下一个数据

long getNextNumber(long t)

{

int b[5];

for(int i=0;i<5;i++)

{

b[i]=t%10;

t/=10;

}

sort(b);

long maxNum=b[0]*10000+b[1]*1000+b[2]*100+b[3]*10+b[4];

long minNum=b[4]*10000+b[3]*1000+b[2]*100+b[1]*10+b[0];

return maxNum-minNum;

}

//通过给定的一个数,可以搜索所有可以生成的数,并判断是否进入了五位圈

void findCyle(long t)

{

memset(bitCurr,0,sizeof(bitCurr));

while(getbit(t)==0)//找到下一个数

{

setbit(t);

setcbit(t);

t=getNextNumber(t);

}

if(getcbit(t)==1 && getpbit(t)==0)//这次访问,还没输出过,进入循环判断输出阶段

{

setpbit(t);

cout<

while(1)//找到下一个数

{

t=getNextNumber(t);

if(getpbit(t)==0)

{

setpbit(t);

cout<<","<

}

else

{

cout<<"]";

break;

}

}

}

}

int main()

{

int i;

memset(bit,0,sizeof(bit));//清空数据

//考虑到时间复杂度,对特殊数据进行了特殊处理

setpbit(11111);

setpbit(22222);

setpbit(33333);

setpbit(44444);

setpbit(55555);

setpbit(66666);

setpbit(77777);

setpbit(88888);

setpbit(99999);

setbit(11111);

setbit(22222);

setbit(33333);

se