第一題
(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
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
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--;
}
}
}