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