5. (6')代碼填空
對一個方陣轉(zhuǎn)置,就是把原來的行號變列號,原來的列號變行號
例如,如下的方陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
轉(zhuǎn)置后變?yōu)椋?/strong>
1 5 9 13
2 6 1014
3 7 1115
4 8 1216
但,如果是對該方陣順時針旋轉(zhuǎn)(不是轉(zhuǎn)置),卻是如下結(jié)果:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
下面的代碼實現(xiàn)的功能就是要把一個方陣順時針旋轉(zhuǎn)。
填空后代碼:
#include <stdio.h>#include <stdlib.h>void rotate(int* x, int rank){ int* y = (int*)malloc(rank*sizeof(x)); // 填空 int i; for(int i=0; i<rank * rank; i++) { y[rank -1 - i/rank + rank * (i%rank)] = x[i]; // 填空 } for(i=0; i<rank*rank; i++) { x[i] = y[i]; } free(y);}int main(int argc, char* argv[]){ int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; int rank = 4; rotate(&x[0][0], rank); for(int i=0; i<rank; i++) { for(int j=0; j<rank; j++) { PRintf("%4d", x[i][j]); } printf("/n"); } return 0;}程序截圖:
6. (9')代碼填空
對于32位字長的機器,大約超過20億,用int類型就無法表示了,我們可以選擇int64類型,但無論怎樣擴展,固定的整數(shù)類型總是有表達的極限!如果對超級大整數(shù)進行精確運算呢?一個簡單的辦法是:僅僅使用現(xiàn)有類型,但是把大整數(shù)的運算化解為若干小整數(shù)的運算,即所謂:“分塊法”。
如圖【1.jpg】表示了分塊乘法的原理。可以把大數(shù)分成多段(此處為2段)小數(shù),然后用小數(shù)的多次運算組合表示一個大數(shù)。可以根據(jù)int的承載能力規(guī)定小塊的大小,比如要把int分成2段,則小塊可取10000為上限值。注意,小塊在進行縱向累加后,需要進行進位校正。
以下代碼示意了分塊乘法的原理(乘數(shù)、被乘數(shù)都分為2段)。

填空后代碼:
#include <stdio.h>void bigmul(int x, int y, int r[]){ int base = 10000; int x2 = x / base; int x1 = x % base; int y2 = y / base; int y1 = y % base; int n1 = x1 * y1; int n2 = x1 * y2; int n3 = x2 * y1; int n4 = x2 * y2; r[3] = n1 % base; r[2] = n1 / base + n2 % base + n3 % base; r[1] = n2 / base + n3 / base + n4 % base; // 填空 r[0] = n4 / base; r[1] += r[2] / base; // 填空 r[2] = r[2] % base; r[0] += r[1] / base; r[1] = r[1] % base;}int main(int argc, char* argv[]){ int x[] = {0,0,0,0}; bigmul(87654321, 12345678, x); printf("%d%d%d%d/n", x[0],x[1],x[2],x[3]); return 0;}程序截圖:
7. (13')代碼填空
今有 6 x 6 的棋盤格。其中某些格子已經(jīng)預先放好了棋子。現(xiàn)在要再放上去一些,使得:每行每列都正好有3顆棋子。我們希望推算出所有可能的放法。下面的代碼就實現(xiàn)了這個功能。
初始數(shù)組中,“1”表示放有棋子,“0”表示空白。

填空后代碼:
#include <stdio.h>int N = 0;bool CheckStoneNum(int x[][6]){ for(int k=0; k<6; k++) { int NumRow = 0; int NumCol = 0; for(int i=0; i<6; i++) { if(x[k][i]) NumRow++; if(x[i][k]) NumCol++; } if(NumRow!=3 || NumCol!=3) return false; // 填空 } return true;}int GetRowStoneNum(int x[][6], int r){ int sum = 0; for(int i=0; i<6; i++) if(x[r][i]) sum++; return sum;}int GetColStoneNum(int x[][6], int c){ int sum = 0; for(int i=0; i<6; i++) if(x[i][c]) sum++; return sum;}void show(int x[][6]){ for(int i=0; i<6; i++) { for(int j=0; j<6; j++) printf("%2d", x[i][j]); printf("/n"); } printf("/n");}void f(int x[][6], int r, int c);void GoNext(int x[][6], int r, int c){ if(c<6) f(x, r, c+1); // 填空 else f(x, r+1, 0);}void f(int x[][6], int r, int c){ if(r==6) { if(CheckStoneNum(x)) { N++; show(x); } return; } if(x[r][c]) // 已經(jīng)放有了棋子 { GoNext(x,r,c); return; } int rr = GetRowStoneNum(x,r); int cc = GetColStoneNum(x,c); if(cc>=3) // 本列已滿 GoNext(x,r,c); else if(rr>=3) // 本行已滿 f(x, r+1, 0); else { x[r][c] = 1; GoNext(x,r,c); x[r][c] = 0; if(!(3-rr >= 6-c || 3-cc >= 6-r)) // 本行或本列嚴重缺子,則本格不能空著! GoNext(x,r,c); }}int main(int argc, char* argv[]){ int x[6][6] = { {1,0,0,0,0,0}, {0,0,1,0,1,0}, {0,0,1,1,0,1}, {0,1,0,0,1,0}, {0,0,0,1,0,0}, {1,0,1,0,0,1} }; f(x, 0, 0); printf("%d/n", N); return 0;}程序截圖:


新聞熱點
疑難解答
圖片精選