華科歷年考研上機題整理

1、任意輸入一串字元,將下標為奇數的小寫字母轉換為大寫(編號從0開始,若該位置上不是字母,則不轉換)。舉例:若輸入abc4Efg,則應輸出aBc4EFg。(字串陣列)

#include<stdio.h>
#include<string.h>
#define MAX 20
void fun(char s[])
{
int i,len;
len=strlen(s);
for(i=1;i<len;i =2)
{
if(s[i]>='a' && s[i]<='z')
{
s[i]-=32;
}
}
}
int main()
{
char str[MAX];
while(gets(str)!=NULL)
{
fun(str);
puts(str);
}
return 0;
}


2、在半個中國象棋棋盤上,馬在左下角(1,1)處,馬走日字…而且只能往右走…不能向左…可上可下…求從起點到(m,n)處有幾種不同的走法(注意:半個棋盤為5行9列)。(函式的遞迴呼叫)

測試資料:

輸入樣例:
5  9 
4  8   
3 2         
4 4   

輸出樣例:

37

20

1

2

#include<stdio.h>
#include<string.h>
int cnt;
void dfs(int x,int y,int m,int n)//行:x,m  列:y,n
{
if(x==m&&y==n)
{
cnt  ;
return;
}
else if(x<1||x>5||y<1||y>9)//棋盤為5行9列
{
return;
}
//只能向右y ,可上可下x -
dfs(x-2,y 1,m,n);
dfs(x 2,y 1,m,n);
dfs(x 1,y 2,m,n);
dfs(x-1,y 2,m,n);
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
cnt=0;
dfs(1,1,m,n);
printf("%d\n",cnt);
}
return 0;
}


3、給定任意倆組字串S1和S2,請程式設計輸出他們間的最大相同子串。例如:S1=12abc78,S2=7bc2,則輸出為:bc。(字串陣列)

#include<stdio.h>
#include<string.h>
void MaxSubString(char s1[],char s2[])//求兩個字串的最大相同子串函式
{
int i,j,m,n,len1,len2,start,maxlen,tmplen;
len1=strlen(s1);
len2=strlen(s2);
maxlen=0;
start=0;
for(i=0;i<len1;i  )//暴力求解
{
for(j=0;j<len2;j  )
{
tmplen=0;
if(s1[i]==s2[j])
{
tmplen  ;
m=i 1;
n=j 1;
while(m<len1&&n<len2)
{
if(s1[m]==s2[n])
tmplen  ;
else
break;
m  ;
n  ;
}
if(tmplen>maxlen)
{
maxlen=tmplen;
start=i;
}
}
}
}
for(i=start;i<start maxlen;i  )
{
printf("%c",s1[i]);
}
puts("");
}
int main()
{
char s1[101],s2[101];
while(scanf("%s%s",s1,s2)!=EOF)
{
MaxSubString(s1,s2);//求兩個字串的最大相同子串函式
}
return 0;
}

4、已知一顆二叉樹S的前序遍歷和中序遍歷序列,請程式設計輸出二叉樹S的後續遍歷序列。(二叉樹,函式遞迴)

(舉例:pred[]/先序:A、B、D、E、C、F、G;

              inod[]/中序:D、B、E、A、C、G、F;

              後序遍歷序列是:D、E、B、G、F、C、A)

#include<stdio.h>
#include<string.h>
char pred[33],inod[33],post[33];
int len;
//int cnt;
void PostOrder(char pred[],int l1,int r1,char inod[],int l2,int r2)
{
int i;
if(l1<=r1)
{
//		post[cnt  ]=pred[l1];//不能再這裡賦值,要按後續遍歷的順序遞迴訪問!!!
for(i=l2;i<=r2;i  )
{
if(inod[i]==pred[l1])
break;
}
PostOrder(pred,l1 1,l1 i-l2,inod,l2,i-1);//左
PostOrder(pred,l1 i-l2 1,r1,inod,i 1,r2);//右
//		post[cnt  ]=pred[l1];//根(儲存後序遍歷結果)
printf("%c",pred[l1]);//根
}
}
int main()
{
int i;
while(scanf("%s%s",pred,inod)!=EOF)
{
len=strlen(pred);
//		cnt=0;
PostOrder(pred,0,len-1,inod,0,len-1);
puts("");
/*		for(i=0;i<len;i  )
{
printf("%c",post[i]);
}
puts("");*/
}
return 0;
}

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<map>
#include<math.h>
#include<string.h>
#include<queue>
#include<vector>
#include<set>
#define LL long long
#define exp 1e-9
#define MAXN 1000010
#define N 3333          
using namespace std;
typedef struct BTNode{
char data;
BTNode *lchild;
BTNode *rchild;
}BTNode;
void postorder(BTNode *bt)
{
if(bt!=NULL)
{
postorder(bt->lchild);
postorder(bt->rchild);
cout<<bt->data;
}
}
BTNode *CreateBT(char pre[],char in[],int l1,int r1,int l2,int r2)
{
BTNode *s;
int i;
if(l1>r1) return NULL;
s=(BTNode *)malloc(sizeof(BTNode));
s->lchild=NULL;
s->rchild=NULL;
for(i=l2;i<=r2;  i)
{
if(in[i]==pre[l1])
break;
}
s->data=in[i];
s->lchild=CreateBT(pre,in,l1 1,l1 i-l2,l2,i-1);
s->rchild=CreateBT(pre,in,l1 i-l2 1,r1,i 1,r2);
return s;
}
int main( )  
{  
//	freopen("D:\\in.txt","r",stdin); 
char pre[33],in[33],post[33];
BTNode *bt;
int len;
while(scanf("%s%s",pre 1,in 1)!=EOF)
{
len=strlen(pre 1);
bt=CreateBT(pre,in,1,len,1,len);
postorder(bt);
puts("");
} 	 
return 0;  
}  

5、列印出所有的“水仙花數”,所謂“水仙花數”是指一個3位數,其各位數字立方和等於該數本身。(舉例:153=1*1*1 3*3*3 5*5*5)(多層迴圈)

#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k;
for(i=1;i<=9;i  )
{
for(j=0;j<=9;j  )
{
for(k=0;k<=9;k  )
{
if(i*100 j*10 k==i*i*i j*j*j k*k*k)
printf("%d ",i*100 j*10 k);
}
}
}
puts("");
return 0;
}


6、求數列s(n)=s(n-1) s(n-2)的第n項的值。其中s(1)=s(2)=1。要求任意給定n,輸出s(n)(遞推基礎)

#include<stdio.h>
#include<string.h>
int f[33];
void init()
{
int i;
f[1]=f[2]=1;
for(i=3;i<=30;i  )
{
f[i]=f[i-1] f[i-2];
}
}
int main()
{
int n;
init();
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",f[n]);
}
return 0;
}

7、按要求輸出:在三位整數(100至999)中尋找符合條件的整數並依次從小到大存入陣列中;他既是完全平方數,又是兩位數字相同,例如144,676等(多位數字的分離,注意與第5題比較)

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int i,j,k,tmp,s;
for(i=1;i<=9;i  )
{
for(j=0;j<=9;j  )
{
for(k=0;k<=9;k  )
{
if(i==j&&i!=k || i==k&&i!=j || j==k&&i!=j)
{
s=i*100 j*10 k;
tmp=sqrt(s);
if(tmp*tmp==s)
{
printf("%d ",s);
}
}
}
}
}
puts("");
return 0;
}


8、在一個整形陣列a中既有負數又有正數,編寫一個演算法將a中所有負數移到整數之前,要求其時間複雜度為O(n),n為陣列長度,並且只使用常數個輔助空間。(輔助空間的使用,陣列元素的選擇性保留)


1、簡單版本的解法:假設陣列中沒有0元素

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int a[9]={1,2,3,4,-1,1,-2,-1,-4};
int i=-1;
int j=sizeof(a)/sizeof(int);
int tmp;
while(i<j)
{
while(a[  i] < 0);
while(a[--j] > 0);
if(i<j)
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
j=sizeof(a)/sizeof(int);
for(i=0;i<j;i  )
{
printf("%d ",a[i]);
}
puts("");
return 0;
}

2、陣列中有0元素(暫無):



9、編寫一個C函式,輸入一個二叉樹的根節點,返回這棵樹中所有值大於0的節點值之和,如果根為空,返回0.

二叉樹的鏈式儲存結構對應的C語言的節點型別定義如下:

Typedef struct node{

  ElemType data;

  struct node *lchild;

  struct node *rchild;

}BTree;

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTree;
int Sum(BTree *bt)
{
if(bt==NULL)
return 0;
else
{
if(bt->data>0)
return bt->data   Sum(bt->lchild)   Sum(bt->rchild);
else
return 0   Sum(bt->lchild)   Sum(bt->rchild);
}
}
void InsertBT(BTree *&bt,int x)
{
BTree *p,*pre;
p=pre=bt;
if(bt==NULL)
{
bt=(BTree *)malloc(sizeof(BTree));
bt->data=x;
bt->lchild=NULL;
bt->rchild=NULL;
}
else
{
while(p)
{
if(p->data>x)
{
pre=p;
p=p->lchild;
}
else
{
pre=p;
p=p->rchild;
}
}
p=(BTree *)malloc(sizeof(BTree));
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(pre->data>x)
{
pre->lchild=p;	
}
else
{
pre->rchild=p;
}
}
}
int main()
{
int a[111];
int i,n;
while(scanf("%d",&n)!=EOF)
{
BTree *bt=NULL;
for(i=1;i<=n;i  )
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i  )
{
InsertBT(bt,a[i]);
}
printf("%d\n",Sum(bt));
}
return 0;
}

10、A是一個長度為N的整形陣列,其中可能包含重複的元素,例如A={1,2,2,3,2,1,3,2},刪除陣列中相同的元素後得到{1,2,3},

a) 如果陣列沒有排序,寫一個C語言函式,輸入引數為陣列首地址和長度,刪除其中重複的元素,返回刪除後的陣列的長度。

b) 上述函式的時間複雜度為多少,以刪除前的陣列長度N表示。

c) 如果陣列A已經排好序,設計並寫出一個C語言函式完成a)中的工作,要求時間複雜度是O(N) 。

(待續)


11、寫一個C語言函式將一顆二叉樹用層序遍歷列出所有節點,即先列出根節點,再從左向右列出深度為1的節點的值,然後再左向右列出深度為2的節點的值,如此繼續。數的節點型別TREENODE包含一個整型值Value和倆個指標:LeftChild和RightChild。可以使用的函式(不限於)包括MaleEmptyQueue (QUEUE *q),

 EnQueue (QUEUE *q,TREENODE *tn)

DeQueue(QUEUE *q,TREENODE *tn) , IsEmpty (QUEUE *q) , DisposeQueue (QUEUE *q)。

(待續)


12、假設以下關於堆疊的庫函式已經給出,unsigned char is empty ();檢查堆疊是否為空,如果是,返回1;否則返回0. void push (char element);把一個char型的資料element 推入棧頂。

Char pop (); 彈出棧頂的char型資料。

(1)  利用這些庫函式設計一個C語言的函式unsignedchar isBalanced (char *string) ,來檢查字串string 中的括號(),[],{}是否平衡,如果平衡,該函式返回1,否則返回0.

(2)  你所設計的函式時間複雜性是多少(假定字串string 長度為n)?

(待續)


13、在一棵高度為O(logn)的二叉排序樹的結點上儲存著浮點數,請用C語言寫一個函式來計算一棵樹上界於任意倆個浮點數x1和x2 (x1<x2)之間的結點數。說明你的演算法的計算複雜度,演算法計算複雜度越低越好。

(待續)


14、編寫演算法實現順序表的逆置,即利用原表的儲存空間將線性表(a1,a2,……,an)逆置為(an,……,a2,a1)。

15、程式設計解決“八皇后問題”:即在一個8*8的矩形格子中排放8個皇后,要滿足的條件包括:任意兩個皇后都不能在同一行、同一列,也不能在同一條對角線(斜率等於1或-1)。

要求程式設計給出所有第一行第一列有皇后的解。

(注:解的輸出用8個數字表示,如:基本解{1,5,8,6,3,7,2,4}其中‘1’代表第一行第一列即(1,1)處有皇后、‘5’代表(2,5)處有皇后……‘4’代表(8,4)處有皇后。)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int c[9];
int cnt;
int n;
void dfs(int r)
{
int i,j,ok;
if(r==n 1)
{
cnt  ;
for(i=1;i<n;i  )
{
printf("%d,",c[i]);
}
printf("%d\n",c[n]);
return;
}
for(i=2;i<=n;i  )//列 
{
c[r]=i;//第r行放第i列 
ok=1;
for(j=1;j<r;j  )//列舉前面r-1行放的情況 
{
if(c[r]==c[j]||c[r]-c[j]==r-j||c[r]-c[j]==j-r)
{
ok=0;
break;
}
}
if(ok)
dfs(r 1);
}
}
int main()
{
scanf("%d",&n);
c[1]=1;//第一行第一列已放好 
cnt=0;
dfs(2);//從第二行開始放 
printf("%d\n",cnt);
return 0;
}

16、問題描述:已知n個人(以編號1,2,3,…,n分別表示)圍坐在一張圓桌周圍,從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。
輸入資料
每行包含3個正整數n,k,m,3個正整數均可以使用32-bit integer來表示。
輸出要求
對於每個測試用例,你應當輸出一行,依次輸出出列人員人員編號,以空格間隔。
輸入樣例
3 2 20
9 1 5
輸出樣例
3 2 1
5 1 7 4 3 6 9 2 8

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int out[22],order[22];
int n,k,m,cnt;
int main()
{
int i,t;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
m--;
memset(out,0,sizeof(out));
t=0;//當前報的數 
cnt=0;//出隊的人數 
for(i=m;;i=(i 1)%n)
{
if(!out[i])
{
t  ;
if(t==k)
{
out[i]=1;
cnt  ;
order[cnt]=i 1;
if(cnt==n)
break;
t=0;
}
}
}
for(i=1;i<=cnt;i  )
{
printf("%d ",order[i]);
}
puts("");
}
return 0;
}

數學遞推法求解約瑟夫問題:一圈共有N個人,開始報數,報到M的人自殺,然後重新開始報數,問最後自殺的人是誰?

問題變為(N-1)個人,報到為(M-1)的人自殺,問題規模減小了。這樣一直進行下去,最後剩下編號為0的人。用函式表示:
F(1)=0
當有2個人的時候(N=2),報道(M-1)的人自殺,最後自殺的人是誰?應該是在只有一個人時,報數時得到的最後自殺的序號加上M,因為報到M-1的人已經自殺,只剩下2個人,另一個自殺者就是最後自殺者,用函式表示:
F(2)=F(1) M
可以得到遞推公式:
F(i)=F(i-1) M
因為可能會超出總人數範圍,所以要求模
F(i)=(F(i-1) M)%i
有了遞推公式就可以在O(N)時間求出結果(結果為F(N) 1)。

17、魔方陣,古代又稱“縱橫圖”,是指組成元素為自然數1、2…n的平方的n×n的方陣,其中每個元素值都不相等,且每行、每列以及主、副對角線上各n個元素之和都相等。

如3×3的魔方陣:
              
    8   1   6  =15
 3   5   7  =15
 4   9   2  =15
    ||    ||    ||
   15 15 15   15(對角線)

魔方陣的排列規律(奇數陣): 
1.將1放在第一行中間一列。 
2.從2開始直到n×n止各數依次按下列規則存放:每一個數存放的行比前一個數的行數減1,列數加1。 
3.如果上一個數的行數為1,則下一個數的行數為n,列數加1。如果上一個數的列數的n時,下一個數的列數為1,行數減1。 
4.如果按上面的規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int m[33][33];
int n;
void mofang(int n)
{
int i,j,pi,pj,cnt;
i=1;
j=n/2 1;
m[i][j]=1;
cnt=2;
while(cnt<=n*n)
{
pi=i;
pj=j;
i--;
if(i==0)
i=n;
j  ;
if(j==n 1)
j=1;
if(m[i][j]!=0 || pi==1&&pj==n)
{
i=pi 1;
j=pj;
}
m[i][j]=cnt;
cnt  ;
}
for(i=1;i<=n;i  )
{
for(j=1;j<=n;j  )
{
printf("%4d ",m[i][j]);
}
puts("");
}
}
int main()
{
//	freopen("D:\\in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(m,0,sizeof(m));
mofang(n);
}
return 0;
} 

18、數獨

Sample Input

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

Sample Output

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<queue>
#define LL long long
#define MAXN 1000010
#define EPS 1e-9
using namespace std;
int g[11][11],r[11][11],c[11][11],cb[11][11];
char m[11][11];
int fg;
void dfs(int k)
{
if(k==81)
{
for(int i=0;i<9;i  )
{
for(int j=0;j<9;j  )
{
printf("%d",g[i][j]);
}
printf("\n");
}
fg=1;
}
int row=k/9;
int col=k%9;
if(g[row][col])
{
dfs(k 1);
}
else
{
int num=row/3*3 col/3;
for(int i=1;i<=9;i  )
{
if(!r[row][i]&&!c[col][i]&&!cb[num][i])
{
r[row][i]=1;
c[col][i]=1;
cb[num][i]=1;
g[row][col]=i;
dfs(k 1);
if(fg)
return;
r[row][i]=0;
c[col][i]=0;
cb[num][i]=0;
g[row][col]=0;
}
}
}
}
int main()
{
int t;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
memset(g,0,sizeof(g));
memset(c,0,sizeof(c));
memset(r,0,sizeof(r));
memset(cb,0,sizeof(cb));
for(int i=0;i<9;i  )
{
cin>>m[i];
for(int j=0;j<9;j  )
{
g[i][j]=m[i][j]-'0';
if(g[i][j])
{
int num=i/3*3 j/3;
cb[num][g[i][j]]=1;
c[j][g[i][j]]=1;
r[i][g[i][j]]=1;
}
}
}
fg=0;
dfs(0);
}
return 0;
}

19、素數環

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int n;
int num[18],vis[18];
int isprime(int x)
{
int i,k;
k=sqrt(x);
for(i=2;i<=k;i  )
{
if(x%i==0)
return 0;
}
return 1;
}
void dfs(int sp)
{
int i,j;
if(sp==n 1)
{
if(isprime(num[n] num[1]))
{
for(j=1;j<=n;j  )
{
printf("%d ",num[j]);
}
puts("");
}
return;
}
else
{
for(i=2;i<=n;i  )
{
if(!vis[i]&&isprime(i num[sp-1]))
{
num[sp]=i;
vis[i]=1;
dfs(sp 1);
vis[i]=0;
num[sp]=0;
}
}
}
}
int main()
{
//	freopen("D:\\in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
num[1]=1;
vis[1]=1;
dfs(2);
}
return 0;
} 

20、漢諾塔

#include <stdio.h>
void move (char a,char b)
{
printf("%c-->%c\n",a,b);
}
void hanuoi(int n,char one ,char two,char three)
{
if (n==1)
move (one,three);
else
{
hanuoi(n-1,one,three,two);
move(one,three);
hanuoi(n-1,two,one,three);
}
}
void main()
{
int n;
printf ("please input the number of disks:");
scanf("%d",&n);
printf("The process of moving disks is listed below\n");
hanuoi(n,'A','B','C');
}

21、 題目:將一個正整數分解質因數。例如:輸入90,列印出90=2*3*3*5。

程式分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成: 

(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。

(2)如果n<>k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整數n,

 重複執行第一步。

(3)如果n不能被k整除,則用k 1作為k的值,重複執行第一步。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
void fenjie(int n)
{
int i;
printf("%d=",n);
for(i=2;i<=n;i  )
{
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n/=i;
}
else
break;
}
}
printf("%d\n",n);
}
int main()
{
//	freopen("D:\\in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
fenjie(n);
}
return 0;
} 

22、騎士遊行問題

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n1,n2,cnt;
int xx[30],yy[30];
int visit[30][30];
int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
//static int dx[8] = {2, 1, -1, -2, -2, -1, 1, 2};
//static int dy[8] = { 1, 2, 2, 1, -1, -2, -2, -1};
int go(int x,int y)
{
if(1<=x&&x<=n1&&1<=y&&y<=n2)
return 1;
return 0;
}
void dfs(int x,int y,int num)
{
int i,xxx,yyy;
xx[num]=x;
yy[num]=y;
if(num==n1*n2)
{
cnt  ;
for(i=1;i<=num;i  )
{
printf("(%d,%d)",xx[i],yy[i]);
}
puts("");
return;
}
for(i=0;i<8;i  )
{
xxx=x dir[i][0];
yyy=y dir[i][1];
if(go(xxx,yyy)&&!visit[xxx][yyy])
{
visit[xxx][yyy]=1;
dfs(xxx,yyy,num 1);
visit[xxx][yyy]=0;
}
}
}
int main()
{
while(scanf("%d%d",&n1,&n2)!=EOF)
{
memset(visit,0,sizeof(visit));
visit[1][1]=1;
dfs(1,1,1);
printf("cnt=%d\n",cnt);
}
return 0;
}

23、蛤跳河

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n1,n2,cnt,minx;
int xx[30],yy[30];
int visit[30][30];
int m[30][30];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int pathx[66][66],pathy[66][66];
int go(int x,int y)
{
if(1<=x&&x<=n1&&1<=y&&y<=n2)
return 1;
return 0;
}
void dfs(int x,int y,int num)
{
int i,xxx,yyy;
xx[num]=x;
yy[num]=y;
if(x==n1 && y==n2)
{
cnt  ;
pathx[cnt][0]=num;
if(minx>num)
minx=num;
for(i=1;i<=num;i  )
{
//			printf("(%d,%d)",xx[i],yy[i]);
pathx[cnt][i]=xx[i];
pathy[cnt][i]=yy[i];
}
//		puts("");
return;
}
for(i=0;i<8;i  )
{
xxx=x dir[i][0];
yyy=y dir[i][1];
if(go(xxx,yyy)&&!visit[xxx][yyy]&&!m[xxx][yyy])
{
visit[xxx][yyy]=1;
dfs(xxx,yyy,num 1);
visit[xxx][yyy]=0;
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n1,&n2)!=EOF)
{
memset(visit,0,sizeof(visit));
memset(m,0,sizeof(m));
visit[1][1]=1;
m[3][1]=m[3][2]=m[3][4]=m[3][5]=1;
minx=999999;
cnt=0;
dfs(1,1,1);
printf("總共有cnt=%d種跳法\n最短距離為%d\n最短距離的跳法如下:\n",cnt,minx);
for(i=1;i<=cnt;i  )
{
if(pathx[i][0]==minx)
{
for(j=1;j<=minx;j  )
{
printf("(%d,%d)",pathx[i][j],pathy[i][j]);
}
puts("");
}
}
}
return 0;
}

24、大數階乘

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,wei,tmp,cy;
int a[9999];
void jiecheng(int n)
{
int i,j;
wei=1;
tmp=1;
cy=0;
a[1]=1;
for(i=2;i<=n;i  )
{
for(j=1;j<=wei;j  )
{
tmp=a[j]*i cy;
a[j]=tmp%10;
cy=tmp/10;
}
while(cy)
{
a[  wei]=cy%10;
cy/=10;
}
}
for(i=wei;i>=1;i--)
printf("%d",a[i]);
puts("");
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
jiecheng(n);
}
return 0;
}

25、超素數

超素數就是這樣的數,比如2333,2是素數,23是素數,233是素數,2333是素數,找出所有的四位超素數。每行輸出六個,數之間空格隔開。(我的做法是先開個10000的陣列,找出每個是素數的陣列值為1,否則為0,對於每個四位數,分別看這幾位是否都是素數即可,注意1不是素數)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int a[10010];
int isprim(int x)
{
int i,k;
k=sqrt(x);
for(i=2;i<=k;i  )
{
if(x%i==0)
return 0;
}
return 1;
}
void init()
{
int i;
memset(a,0,sizeof(a));
for(i=2;i<=9999;i  )
{
if(isprim(i))
{
a[i]=1;
}
}
}
int isSuperPrim(int x)
{
int n1,n2,n3,n4;
n1=x/1000;
n2=x/100;
n3=x/10;
n4=x;
return (a[n1]&a[n2]&a[n3]&a[n4]);
}
int main()
{
int i,cnt;
init();
cnt=0;
for(i=1000;i<10000;i  )
{
if(isSuperPrim(i))
{
cnt  ;
if(cnt!=6)
{
printf("%d ",i);
}
else
{
printf("%d\n",i);
cnt=0;
}
}
}
return 0;
}

26、 兩個二進位制數加減乘除,short型的,十六位,比如101 100 ,輸出1001,也可把前幾位0輸出。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int BinaryToDec(char ch[],int n)
{
int sum,flag,i;
sum = 0;
flag = 1;
for(i=n-1; i>=0; i--)
{
sum  = flag * (ch[i]-'0');
flag *= 2;
}
return sum;
}
void getResult(int a,int b,char op)
{
char ch[100];
int result;
switch (op)
{
case ' ':
result =  a   b;
break;
case '-':
result =  a - b;
break;
case '*':
result =  a * b;
break;
case '/':
result =  a / b;
break;
default :
return ;
}
itoa(result,ch,2);
printf("%s\n",ch);
}
int main()
{
char ch1[100],ch2[100],oper;
int num1,num2;
while(scanf("%s %s %c",ch1,ch2,&oper) != EOF)
{
num1 = BinaryToDec(ch1,strlen(ch1));
num2 = BinaryToDec(ch2,strlen(ch2));
getResult(num1,num2,oper);
}
return 0;
}

27、 迴旋矩陣:  如5的迴旋矩陣是

1    2    3  4   5
16  17  18 19   6
15  24 25 20   7
14  23  22  21  8      
13   12   11  10   9
輸入一個n,求他的迴旋矩陣。

#include<stdio.h>
int main()
{
int size,s;
int matrix[100][100]={0};
int c;
int d=1;
int i,j,m,n,l;
while(1)
{
printf("請輸入迴旋矩陣大小(1-100):");
scanf("%d",&size);
s=size;
for( i=0;i<size;i  )
{
for( j=i;j<size;j  )
{
matrix[i][j]=d;
d  ;
if(j==size-1)
{
for( m=i 1;m<size;m  )
{
matrix[m][j]=d;
d  ;
if(m==size-1)
{
for( n=size-2;n>=i;n--)
{
matrix[m][n]=d;
d  ;
if(n==i)
{
for( l=size-2;l>=i 1;l--)
{
matrix[l][n]=d;
d  ;
}
}
}
}
}
}
}
size--;
}
for(int p=0;p<s;p  )
{
for(int q=0;q<s;q  )
{
printf("%3d",matrix[p][q]);
if(q==s-1)
printf("\n");
}
}
d=1;
printf("輸入1繼續,輸入0退出:");
scanf("%d",&c);
if(c==1)continue;
if(c==0)break;
}
return 0;
}