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

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

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

2019-11-11 00:33:18
字體:
來源:轉載
供稿:網友

5. (6')代碼填空

對一個方陣轉置,就是把原來的行號變列號,原來的列號變行號

例如,如下的方陣:

 1 2  3  4

 5 6  7  8

 9 10 11 12

13 14 15 16

轉置后變為:

 1 5  9 13

 2  6 1014

 3  7 1115

 4  8 1216

但,如果是對該方陣順時針旋轉(不是轉置),卻是如下結果:

13  9 5  1

14 10  6  2

15 11  7  3

16 12  8  4

下面的代碼實現的功能就是要把一個方陣順時針旋轉。

填空后代碼:

#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類型,但無論怎樣擴展,固定的整數類型總是有表達的極限!如果對超級大整數進行精確運算呢?一個簡單的辦法是:僅僅使用現有類型,但是把大整數的運算化解為若干小整數的運算,即所謂:“分塊法”。

        如圖【1.jpg】表示了分塊乘法的原理。可以把大數分成多段(此處為2段)小數,然后用小數的多次運算組合表示一個大數。可以根據int的承載能力規定小塊的大小,比如要把int分成2段,則小塊可取10000為上限值。注意,小塊在進行縱向累加后,需要進行進位校正。

        以下代碼示意了分塊乘法的原理(乘數、被乘數都分為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 的棋盤格。其中某些格子已經預先放好了棋子。現在要再放上去一些,使得:每行每列都正好有3顆棋子。我們希望推算出所有可能的放法。下面的代碼就實現了這個功能。

        初始數組中,“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])  // 已經放有了棋子	{		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;}程序截圖:


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

圖片精選

主站蜘蛛池模板: 巨野县| 西乌珠穆沁旗| 西畴县| 南郑县| 新建县| 阿克苏市| 上饶县| 屯门区| 晋州市| 平邑县| 肃宁县| 朝阳县| 邓州市| 涡阳县| 汾阳市| 温宿县| 永康市| 深水埗区| 广饶县| 南皮县| 中阳县| 星子县| 澳门| 兴山县| 惠州市| 长泰县| 枞阳县| 全椒县| 常熟市| 大安市| 霍州市| 界首市| 肃宁县| 竹山县| 金山区| 龙山县| 肇庆市| 通许县| 云梦县| 石台县| 大同市|