修改了部分代码,但是位数还是过不了60000多位,不管了,连机子重启的办法都用上来还解决不了,哎!
# include <stdio.h>
# include <math.h>
long int xh,wei;
struct str //结构里放的是3的次方数
{ //结果需要的都是3的n次方数,其实只要对0--n进行排序就行,只在输出时运算成3的次方
int i; //0就是3的0次方,i就是3的i次方
struct str *next;
struct str *qian;
}*xulie2,*a,*b,*c; //函数hs()都是对xulie2进行操作,借abc用来对xulie2进行添加或删除
printxulie(struct str *xulie) //输出最后结果集
{
struct str *pa;
pa=xulie;
if(pa->next==0) printf("%.0f ",pow(3,pa->i));
else
for(;pa!=0;pa=pa->next)
printf("%.0f ",pow(3,pa->i));
}
hs() //////函数,按从大到小的顺序逐个找出放到链表里
{
if(xh==wei-1) //此时的xh比wei小1时
{
printxulie(a); //直接输出序列,比如{9 7 6}
printf("1\n"); //然后后面补数1
return(0);
}
else
if(xh==wei-2) //因为输出结果要从大到小,所以补3的1次方3
{
printxulie(a);
printf("3\n");
return(0);
}
else
if(xh==wei-3) //前两次的不是要的结果,xh+3才是,所以补3和1
{
printxulie(a);
printf("3 1\n");
return(0);
}
else //前三次都不是,xh=xh+4
{
xh=xh+4; //比如当前序列是{9 7 6}序列各个数代表3的次方
if(c->i>2) //c即序列最后一个大与3的2次方9,比如上面的3的6次方就大于2次方
{
if(xh==wei) //{9 7 6}后应该是{9 7 6 0}{9 7 6 1}{9 7 6 1 0}这三个刚才进入此函数后比较过了不是
{ //而再后就应该是{9 7 6 2},所以是在序列后补2
printxulie(a);
printf("9\n"); //输出时补的2就应该是9了
return(0);
}
else
{ //补2在这里进行
b=(struct str*)malloc(sizeof(struct str));
b->i=2;
b->next=0;
b->qian=c;
c->next=b; //让c还是指向序列最后
c=b;
hs(); //再次进入hs()
}
}
else if(c->i==2) //如果序列不是{9 7 6}最后一个不是2,如{9 7 2}
{
if(c->qian==0)//如果序列只一个数{2}
c->i=3; //那么2升到3,{2 0}{2 1}{2 1 0}在函数开始就被排除
else //如果序列不是一个数如{9 7 4 3 2}
{ //如上c->i是2,c前面是3
while(c->i==c->qian->i-1)
{
c=c->qian; //把432都抛弃,因为97432前的974320 974321 9743210hs()前面比较过
free(c->next);
}
c->i=c->i+1; //让c指向7,此时序列是{9 7}
c->next=0;
}
if(xh==wei) //如果xh=wei
{
printxulie(a); //直接输出
printf("\n");
return(0);
}
else //继续进入hs()
hs();
}
}
return(0);
}
main()
{
struct str *pa;
scanf("%ld",&wei);
while(wei>1)
{ //{},{1},{3},{1 3},{9}
wei=wei-1; //减1是为了给空集{}占个位
if(wei==1) //减1后是1,那就是3的0次方1
printf("1\n");
else if(wei==2) printf("3\n");
else if(wei==3) printf("3 1\n");
else //从第四开始
{
xh=4; //xh从第4个开始
xulie2=(struct str*)malloc(sizeof(struct str)); //开始纪录链表
xulie2->i=2; //链表头一个一定要是最大数这样免去以后输出时排序
xulie2->next=0; //第一个放2代表3的2次方的2
xulie2->qian=0;
a=c=xulie2; //a,b,c定义成全局的,避免abc反复带入子函数时反复定义赋值
if(xh==wei) //直接输出
{
printxulie(xulie2);
printf("\n");
}
else hs(); //进入子函数hs()
}
scanf("%ld",&wei); //继续输入要找的第wei的子集
pa=xulie2;
if(wei<2) break;
else
for(;pa!=0;) //释放内存,原结果集的链表内容
{
pa=xulie2;
xulie2=pa->next;
free(pa);
}
}
}
[此贴子已经被作者于2007-3-13 10:13:28编辑过]