如题,自测这里面的五个数据都过了,但是提交只过#4 这里有五个测试数据
#include <stdio.h>
#include <stdlib.h>
typedef struct _huiwenshu{
int a;
int b;
struct _huiwenshu *shangwei;
struct _huiwenshu *xiawei;
} intshu;//记录每一位的数
typedef struct _shuliebiao{
intshu *head;
intshu *tail;
} qh;//一个数位集合的表
void hui(qh *p,int e)
{
int w;
intshu *n,*l;
for(w=0,n=p->tail,l=p->head;;n=n->shangwei,l=l->xiawei)
{
if(n==l)
{
w=n->a+l->a,n->a=w%e,w/=e;
n->shangwei->b+=w;
break;
}
w=n->a+l->a,n->a=l->a=w%e,w/=e;
n->shangwei->b+=w;
if(w&&l->shangwei==NULL)
{
intshu *m=(intshu*)malloc(sizeof(intshu));
m->b=0,m->a=w,m->shangwei=NULL,m->xiawei=l;
p->head=p->head->shangwei=m;
}
else if(w) l->shangwei->b=w;
if(n->shangwei==l) break;
}//将两数表按照e进制相加
n=p->tail;
while(n!=NULL){
w=n->a+n->b;
if(w>e-1)
{
w%=e;
if(n->shangwei==NULL)
{
intshu *m=(intshu*)malloc(sizeof(intshu));
m->b=m->a=0,m->shangwei=NULL,m->xiawei=n;
p->head=p->head->shangwei=m;
}
n->shangwei->b++;
}
n->a=w;
n->b=0;
n=n->shangwei;
}
}
int judge(qh *p)
{
intshu *c=p->head,*b=p->tail;
for(;c->a==b->a&&b!=c&&c->xiawei!=b;c=c->xiawei,b=b->shangwei){}
if(c==b||c->a==b->a) return 0;
else return 1;
}//判断是否为回文数
int main()
{
int i,e,step=0;
char a[100];
qh biao;
biao.head=biao.tail=NULL;
scanf("%d ",&e);
fgets(a,100,stdin);
if(e==16)
for(i=0;a[i]!='\n';i++)
if(a[i]>'9')
a[i]='9'+'A'-a[i]+1;
for(i=0;a[i]!='\n';i++)
{
intshu *m=(intshu*)malloc(sizeof(intshu));
m->b=0,m->a=a[i]-'0',m->xiawei=NULL;
if(biao.head==NULL) biao.head=biao.tail=m,m->shangwei=NULL;
else m->shangwei=biao.tail,biao.tail->xiawei=m,biao.tail=m;
}//收数进表
for(;judge(&biao)&&step<31;step++)
hui(&biao,e);
if(step<31) printf("STEP=%d",step);
else printf("Impossible!");
intshu *w,*r=biao.head;
while(r!=NULL)
{
w=r,r=r->xiawei;
free(w);
}
return 0;
}