国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

2012年第三屆藍橋杯C/C++組真題訓練(二)(2017.2.8)

2019-11-10 21:34:02
字體:
供稿:網(wǎng)友

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;}程序截圖:


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 宜兴市| 扎囊县| 汝阳县| 新巴尔虎右旗| 探索| 沽源县| 双流县| 革吉县| 永寿县| 剑阁县| 齐河县| 民权县| 天祝| 长海县| 仪征市| 梁山县| 枣强县| 汕尾市| 汤阴县| 河东区| 铁岭县| 宾阳县| 郯城县| 丹寨县| 舒兰市| 大悟县| 武穴市| 车致| 凉城县| 通道| 准格尔旗| 湟中县| 琼结县| 横峰县| 姚安县| 岚皋县| 阳高县| 宜州市| 长岛县| 洛宁县| 五莲县|