第一题
(1).返回数组a前n+1个元素中最大的元素。
(2).f(109)=99,
f(97)=91.
(3). g(1,10)=4.
/*====================================================================================*/
/*函数名称:2001_2.c */
/*程序目的:将Ackrman函数改写为非递归函数 */
/*Writen by Apechn ,Soft Lab of JLU */
/*====================================================================================*/
//[解题思想]:用一个堆栈来实现递归过程。
long ack(int m,int n)
{
int a[2000],top=-1; //a[2000]用来模拟堆栈,top为栈顶指针
top++; //把m和n压入堆栈
a[top]=m;
top++;
a[top]=n;
while(top!=0) //直到堆栈中只剩下一个元素为止
{
n=a[top];
top--;
m=a[top];
top--;
if(m==0)
{
top++;
a[top]=n+1;
continue;
}
if(n==0)
{
top++;
a[top]=m-1;
top++;
a[top]=1;
continue;
}
top++;
a[top]=m-1;
top++;
a[top]=m;
top++;
a[top]=n-1;
}
return a[top]; //返回堆栈中最后一个数
}
/*====================================================================================*/
/*函数名称:2001_3.c */
/*程序目的:求给定字符表的对偶表 */
/*Writen by Apechn ,Soft Lab of JLU */
/*====================================================================================*/
[解题思想]:把 L1和 L2两个表分别扫描一遍,把扫描得到的数对放到对偶表中。最后再把对偶表中的相同元素删除即可。
struct node //对偶表的结点结构
{
char x;
char y;
node* next;
}
node* head; //对偶表的头指针
void del() //删除函数,删除相同元素
{
node *p=head,*q,*r;
whiel(p!=NULL)
{
q=p->next;
r=p;
while(q!=NULL)
{
if(p->x==q->x&&p->y==q->y)
{
r->next=q->next;
delete q;
q=r->next;
break;
}
else
{
r=q;
q=q->next;
}
}
p=p->next;
}
}
void fun(char L1[],char L2[]) //题目所求的函数
{
int i,j;
node* p;
for(i=0;i<m;i++) //把两个表分别扫描一次
for(j=0;j<n;j++)
{
p=new node; //从表头插入结点
p->x=L1[i];
p->y=L2[j];
p->next=head;
head=p;
p=new node; //从表头插入结点
p->x=L2[j];
p->y=L1[i];
p->next=head;
head=p;
}
del(); //删除相同的元素
}
/*====================================================================================*/
/*函数名称:2001_4.c */
/*程序目的:写出给定数组的螺旋数组 */
/*Writen by Apechn ,Soft Lab of JLU */
/*====================================================================================*/
//[解题思想]:设一个方向变量orient,取值0、1、2、3分别代表往右、往下、往左、往上。当遇到边界或当前//位置已经有东西时,调整方向。
//否则一直顺着当前方向走下去。走到一个位置,把a数组的相应位置的字符写到b上。
const int n=4;
void fun(char a[][n],char b[][n])
{
int i=0,j=0,p=0,orient=0;
while(p<n*n)
{
if(orient==0) //如果当前方向为向右
{
if(j==n||b[i][j]!=32) //如果已经到达边界或当前位置已经有字符
{
i++; //调整方向
j--;
orient=(orient+1)%4;
continue;
}
else
{
b[i][j]=a[p/n][p%n]; //否则把a的相同字符填到b中
p++; //a和b都指向下一个位置
j++;
}
}
if(orient==1) //如果当前方向为向下
{
if(i==n||b[i][j]!=32)
{
i--;
j--;
orient=(orient+1)%4;
continue;
}
else
{
b[i][j]=a[p/n][p%n];
p++;
i++;
}
}
if(orient==2) //如果当前方向为向左
{
if(j==-1||b[i][j]!=32)
{
i--;
j++;
orient=(orient+1)%4;
continue;
}
else
{
b[i][j]=a[p/n][p%n];
p++;
i--;
}
}
if(orient==3) //如果当前方向为向上
{
if(i==-1||b[i][j]!=32)
{
i++;
j++;
orient=(orient+1)%4;
continue;
}
else
{
b[i][j]=a[p/n][p%n];
p++;
i--;
}
}
}