2015年蓝桥杯C组试题及答案讲解

更新时间:2024-01-01 09:18:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2014年蓝桥杯c语言试题及答案 发布时间:2015-04-09 1. 标题: 马虎的算式

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ?

但结果却很戏剧性,他的答案竟然是对的!! 因为 36 * 495 = 396 * 45 = 17820

类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢? 请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。 满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。 答案直接通过浏览器提交。

注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。 答案:142

2. 标题: 振兴中华

小明参加了学校的趣味运动会,其中的一个项目是:跳格子。

地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg) 从我做起振 我做起振兴 做起振兴中 起振兴中华

比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。 要求跳过的路线刚好构成“从我做起振兴中华”这句话。 请你帮助小明算一算他一共有多少种可能的跳跃路线呢? 答案是一个整数,请通过浏览器直接提交该数字。 答案:35

3. 题目标题: 猜年龄

美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:

“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。 通过浏览器,直接提交他那时的年龄数字。 注意:不要提交解答过程,或其它的说明文字。 答案:18

4. 标题: 幻方填空

幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。

欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。

他把1,2,3,...16 这16个数字填写在4 x 4的方格中。 如图p1.jpg所示,即: 16 ? ? 13 ? ? 11 ? 9 ? ? * ? 15 ? 1

表中有些数字已经显露出来,还有些用?和*代替。

请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。

答案是一个整数,请通过浏览器直接提交该数字。 答案:12

5. 题目标题:公约数公倍数

我们经常会用到求两个整数的最大公约数和最小公倍数的功能。 下面的程序给出了一种算法。 函数 myfunc 接受两个正整数a,b

经过运算后打印出 它们的最大公约数和最小公倍数。 此时,调用 myfunc(15,20) 将会输出: 3 60

// 交换数值

void swap(int *a,int *b) {

int temp; temp=*a; *a=*b; *b=temp; }

void myfunc(int a, int b) {

int m,n,r; if(a

m=a;n=b;r=a%b; while(r!=0) {

a=b;b=r; r=a%b; }

printf(\最大公约数

printf(\最小公倍数 }

请分析代码逻辑,并推测划线处的代码,通过网页提交。 答案: m*n/b

6.标题:三部排序

一般的排序有许多经典算法,如快速排序、希尔排序等。 但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。

比如,对一个整型数组中的数字进行分类排序:

使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!

以下的程序实现了该目标。

其中x指向待排序的整型数组,len是数组的长度。 void sort3p(int* x, int len) {

int p = 0; int left = 0;

int right = len-1; while(p<=right){ if(x[p]<0){

int t = x[left]; x[left] = x[p]; x[p] = t; left++; p++; }

else if(x[p]>0){ int t = x[right]; x[right] = x[p]; x[p] = t; right--; }

else{

__________________________; //填空位置 } } }

如果给定数组:

25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0 则排序后为:

-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25

请分析代码逻辑,并推测划线处的代码,通过网页提交

答案:p++

7. 标题:核桃的数量

小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:

1. 各组的核桃数量必须相同

2. 各组内必须能平分核桃(当然是不能打碎的)

3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛) 程序从标准输入读入: a b c

a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)

程序输出:

一个正整数,表示每袋核桃的数量。 例如:

用户输入: 2 4 5

程序输出: 20

再例如: 用户输入: 3 1 1

程序输出: 3

#include

void swap(int *a, int *b) {

int temp; temp = *a; *a = *b; *b = temp; }

int f(int a, int b) {

int m, n, r; if (a

m = a, n = b, r = a % b; while (r != 0) {

a = b; b = r;

r = a % b; }

return m * n / b; }

int main() {

int a, b, c;

scanf(\ printf(\ return 0; }

8. 题目标题:打印十字图

小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)

$$$$$$$$$$$$$ $ $

$$$ $$$$$$$$$ $$$ $ $ $ $

$ $$$ $$$$$ $$$ $ $ $ $ $ $ $

$ $ $$$ $ $$$ $ $ $ $ $ $ $ $ $ $ $ $ $$$$$ $ $ $ $ $ $ $ $ $ $ $ $ $$$ $ $$$ $ $ $ $ $ $ $ $

$ $$$ $$$$$ $$$ $ $ $ $ $

$$$ $$$$$$$$$ $$$ $ $

$$$$$$$$$$$$$

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。 输入格式:

一个正整数 n (n<30) 表示要求打印图形的层数 输出:

对应包围层数的该标志。 例如:

用户输入: 1

程序应该输出: ..$$$$$.. ..$...$.. $$$.$.$$$ $...$...$ $.$$$$$.$ $...$...$

$$$.$.$$$ ..$...$.. ..$$$$$.. 再例如: 用户输入: 3

程序应该输出: ..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..

请仔细观察样例,尤其要注意句点的数量和输出位置。 #include

void swap(int *a, int *b) {

int temp; temp = *a; *a = *b; *b = temp; }

int go(int i, int j, int n) {

if (i > n * 2 + 3) i = n * 4 + 6 - i; if (j > n * 2 + 3) j = n * 4 + 6 - j;

if (i < j) swap(&i, &j);

if (i <= 2 && j <= 2) return 0;

if (i % 2 == 1 && j >= i - 2) return 1; if (j % 2 == 1 && j != i - 1) return 1; return 0;

}

int main() {

int n;

scanf(\ int i, j;

for (i = 1; i <= n*4+5; i++) {

for (j = 1; j <= n*4+5; j++) {

if (go(i, j, n)) printf(\ else

printf(\ }

printf(\ }

return 0; }

9. 标题:带分数

100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100 有 11 种表示法。 题目要求:

从标准输入读入一个正整数N (N<1000*1000)

程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法! 例如:

用户输入: 100

程序输出: 11

再例如: 用户输入: 105

程序输出: 6

#include #define N 9

int num[N] = {1,2,3,4,5,6,7,8,9};

int tag[3][3] = {{4,3,2},{5,3,1},{6,2,1}}; void swap(int *a, int *b)

{

int temp; temp = *a; *a = *b; *b = temp; }

int go(int i, int n) {

int a, b, c; int count = 0;

for (a = 0; a < 3; a++) {

int r[3] = {0} , d = 0; for (b = 0; b < 3; b++)

for (c = 0; c < tag[a][b]; c++) r[b] = r[b] * 10 + num[d++];

if (r[0] + r[1] / r[2] == n && r[1] % r[2] == 0) count++; if (r[0] + r[2] / r[1] == n && r[2] % r[1] == 0) count++; if (r[1] + r[0] / r[2] == n && r[0] % r[2] == 0) count++; if (r[1] + r[2] / r[0] == n && r[2] % r[0] == 0) count++; if (r[2] + r[0] / r[1] == n && r[0] % r[1] == 0) count++; if (r[2] + r[1] / r[0] == n && r[1] % r[0] == 0) count++; }

while (i < N) {

int k = i + 1; while (k < N) {

swap(num + i, num + k); count += go(i + 1, n); swap(num + i, num + k); k++; } i++; }

return count; }

int main() {

int n;

scanf(\

printf(\return 0; }

10. 标题:剪格子

如图p1.jpg所示,3 x 3 的格子中填写了一些整数。

我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。

本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。

如果无法分割,则输出 0 程序输入输出格式要求:

程序先读入两个整数 m n 用空格分割 (m,n<10) 表示表格的宽度和高度

接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000 程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。

例如:

用户输入: 3 3 10 1 52 20 30 1 1 2 3

则程序输出: 3

再例如: 用户输入: 4 3 1 1 1 1 1 30 80 2 1 1 1 100 则程序输出: 10

#include

#define N 10 int num[N][N];

int tag[N][N] = {0}; int m, n; int r = 100;

int find(int i, int j, int t, int ntag[][N]) {

int count = 0;

if (i < 0 || i >= n || j < 0 || j >= m || ntag[i][j] == 1) return 0;

ntag[i][j] = 1; if (tag[i][j] != t)

return 0; count++;

count += find(i - 1, j, t, ntag); count += find(i + 1, j, t, ntag); count += find(i, j - 1, t, ntag); count += find(i, j + 1, t, ntag); return count; }

int isbad() {

int i, j, k = 0; int t = tag[0][0]; int ntag1[N][N] = {0}; int ntag2[N][N] = {0};

int ge1 = find(0, 0, t, ntag1); for (i = 0; i < n; i++) {

for (j = 0; j < m; j++) {

if (tag[i][j] != t) {

k = 1; break; } }

if (k == 1) break; }

if (i == n && j == m) return 0;

int ge2 = find(i, j, tag[i][j], ntag2); return ge1 + ge2 != m * n; }

int bad(int i, int j) {

if (i < 0 || i >= n || j < 0 || j >= m || tag[i][j] == 1) return 1;

tag[i][j] = 1; int b = isbad(); tag[i][j] = 0; return b; }

void go(int i, int j, int k, int count) {

if (bad(i, j) || count < num[i][j]) return; k++;

if (count == num[i][j]) {

if (r > k) r = k; }

tag[i][j] = 1;

count -= num[i][j]; go(i - 1, j, k, count); go(i + 1, j, k, count); go(i, j - 1, k, count); go(i, j + 1, k, count); tag[i][j] = 0; }

int main() {

scanf(\ int i, j; int half = 0;

for (i = 0; i < n; i++) for (j = 0; j < m; j++) {

scanf(\ half += num[i][j]; }

if (half % 2 == 0 && half >= num[0][0] * 2) {

half /= 2;

go(0, 0, 0, half); }

if (r == 100) r = 0;

printf(\ return 0; }

隔行变色

Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。

小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,.... 现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行。

请你直接提交这个整数,千万不要填写任何多余的内容。

立方尾不变

有些数字的立方的末尾正好是该数字本身。 比如:1,4,5,6,9,24,25,....

请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。

请提交该整数,不要填写任何多余的内容。

三羊献瑞

观察下面的加法算式:

祥 瑞 生 辉 + 三 羊 献 瑞 ------------------- 三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1.jpg】)

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

格子中输出

StringInGrid函数会在一个指定大小的格子中打印指定的字符串。 要求字符串在水平、垂直两个方向上都居中。 如果字符串太长,就截断。

如果不能恰好居中,可以稍稍偏左或者偏上一点。

下面的程序实现这个逻辑,请填写划线部分缺少的代码。

#include

#include

void StringInGrid(int width, int height, const char* s) {

int i,k;

char buf[1000]; strcpy(buf, s);

if(strlen(s)>width-2) buf[width-2]=0; printf(\

for(i=0;i

for(k=1; k<(height-1)/2;k++){ printf(\

for(i=0;i

printf(\

printf(\/填空

printf(\

for(k=(height-1)/2+1; k

for(i=0;i

printf(\

for(i=0;i

int main() {

StringInGrid(20,6,\ return 0; }

对于题目中数据,应该输出: +------------------+

| | | abcd1234 |

| | | | +------------------+

/

(如果出现对齐问题,参看【图1.jpg】)

注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

串逐位和

给定一个由数字组成的字符串,我们希望得到它的各个数位的和。 比如:“368” 的诸位和是:17

这本来很容易,但为了充分发挥计算机多核的优势,小明设计了如下的方案:

int f(char s[], int begin, int end) {

int mid;

if(end-begin==1) return s[begin] - '0'; mid = (end+begin) / 2;

return ____________________________________; //填空 }

int main() {

char s[] = \ printf(\ return 0; }

你能读懂他的思路吗? 请填写划线部分缺失的代码。

注意:只填写缺少的部分,不要填写已有代码或任何多余内容。

奇妙的数字

小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。

你能猜出这个数字是多少吗?

请填写该数字,不要填写任何多余的内容。

加法变乘法

我们都知道:1+2+3+ ... + 49 = 1225

现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:

1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015 就是符合要求的答案。

请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。

注意:需要你提交的是一个整数,不要填写任何多余的内容。 #include #include int main() { int i, j;

for ( i = 1; i<30; i++){ for ( j = i + 2; j<30; j++){

if (1225 - 2 * i - 1 - 2 * j - 1 + j*(j + 1) + i*(i + 1) == 2015) printf(\

} }

system(\return 0; } 饮料换购

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。

请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。

输入:一个整数n,表示开始购买的饮料数量(0

程序应该输出: 149

用户输入:

101

程序应该输出: 151

资源约定:

峰值内存消耗 < 256M CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。 打印大X

小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。 为了便于比对空格,所有的空白位置都以句点符来代替。

要求输入两个整数m n,表示笔的宽度,X的高度。用空格分开(0

例如,用户输入: 3 9

程序应该输出: ***.....*** .***...***. ..***.***.. ...*****... ....***.... ...*****... ..***.***.. .***...***. ***.....***

(如有对齐问题,参看【图1.jpg】)

再例如,用户输入: 4 21

程序应该输出 ****................**** .****..............****. ..****............****.. ...****..........****... ....****........****.... .....****......****..... ......****....****...... .......****..****....... ........********........ .........******......... ..........****.......... .........******......... ........********........ .......****..****....... ......****....****...... .....****......****..... ....****........****.... ...****..........****... ..****............****.. .****..............****. ****................****

(如有对齐问题,参看【图2.jpg】)

资源约定:

峰值内存消耗 < 256M CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

垒骰子

赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。

经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。

假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。

两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。 由于方案数可能过多,请输出模 10^9 + 7 的结果。

不要小看了 atm 的骰子数量哦~

「输入格式」 第一行两个整数 n m n表示骰子数目

接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。

「输出格式」

一行一个数,表示答案模 10^9 + 7 的结果。

「样例输入」 2 1 1 2

「样例输出」 544

「数据范围」

对于 30% 的数据:n <= 5 对于 60% 的数据:n <= 100

对于 100% 的数据:0 < n <= 10^9, m <= 36

资源约定:

峰值内存消耗 < 256M CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

蓝桥杯c语言试题2015 发布时间:2015-04-09 第一题:

假设有两种微生物 X 和 Y

X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。 现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。 如果X=10,Y=90 呢?

本题的要求就是写出这两种初始条件下,60分钟后Y的数目。 第二题:

ABCDE * ? = EDCBA

“ABCDE代表不同的数字,问号也代表某个数字!” 第三题:

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复…… 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。 等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“……昨天,我正好喝了一瓶…….奉劝大家,开船不喝酒,喝酒别开船……”

请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。 如果有多个可能的答案,请列出所有答案,每个答案占一行。 格式是:人数,人数,…

例如,有一种可能是:20,5,4,2,0 第四题:

某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。 每位选手都有一个起步的分数为10分。

某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗? 如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。

你的任务是算出所有可能情况。每个答案占一行。 第五题:

这道题是代码填空题,目的是把一个矩阵顺时针旋转。 1 2 3 4 13 9 5 1

5 6 7 8 –> 14 10 6 2 9 10 11 12 15 11 7 3 13 14 15 16 16 12 8 4

题目附带的不完整代码: 01

void rotate(int* x, int rank) 02 { 03

int* y = (int*)malloc(___________________); // 填空 04 05

for(int i=0; i 06 { 07

y[_________________________] = x[i]; // 填空 08 } 09 10

for(i=0; i 11 { 12

x[i] = y[i]; 13 } 14 15 free(y); 16 } 17 18

int main(int argc, char* argv[]) 19 { 20

int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; 21

int rank = 4; 22 23

rotate(&x[0][0], rank); 24 25

for(int i=0; i 26 { 27

for(int j=0; j 28

{ 29

printf(\30 } 31

printf(\32 } 33 34

return 0; 35 }

第六题:

依旧是补全代码,大数乘法,本来还算比较繁杂的,但是题目当时附了图,变的很简单题目附带的不完整代码: 01

void bigmul(int x, int y, int r[]) 02 { 03

int base = 10000; 04

int x2 = x / base; 05

int x1 = x % base; 06

int y2 = y / base; 07

int y1 = y % base; 08 09

int n1 = x1 * y1; 10

int n2 = x1 * y2; 11

int n3 = x2 * y1; 12

int n4 = x2 * y2; 13 14

r[3] = n1 % base;

15

r[2] = n1 / base + n2 % base + n3 % base; 16

r[1] = ____________________________________________; // 填空 17

r[0] = n4 / base; 18 19

r[1] += _______________________; // 填空 20

r[2] = r[2] % base; 21

r[0] += r[1] / base; 22

r[1] = r[1] % base; 23 } 2425

int main(int argc, char* argv[]) 26 { 27

int x[] = {0,0,0,0}; 28 29

bigmul(87654321, 12345678, x); 30 31

printf(\ 32 33

return 0; 34 }

第七题:

补全代码,有个6*6的棋盘,预先已经放置了一部分棋子,现在要再补充棋子使得每行每列都有3个棋子

题目附带的不完整代码: 001

int N = 0; 002 003

bool CheckStoneNum(int x[][6]) 004

{ 005

for(int k=0; k<6; k++) 006 { 007

int NumRow = 0; 008

int NumCol = 0; 009

for(int i=0; i<6; i++) 010 { 011

if(x[k][i]) NumRow++; 012

if(x[i][k]) NumCol++; 013 } 014

if(_____________________) return false; // 填空 015 } 016

return true; 017 } 018 019

int GetRowStoneNum(int x[][6], int r) 020 { 021

int sum = 0; 022

for(int i=0; i<6; i++) if(x[r][i]) sum++; 023

return sum; 024 } 025 026

int GetColStoneNum(int x[][6], int c) 027

{ 028

int sum = 0; 029

for(int i=0; i<6; i++) if(x[i][c]) sum++; 030

return sum; 031 } 032 033

void show(int x[][6]) 034 { 035

for(int i=0; i<6; i++) 036 { 037

for(int j=0; j<6; j++) printf(\038

printf(\039 } 040

printf(\041 } 042 043

void f(int x[][6], int r, int c); 044 045

void GoNext(int x[][6], int r, int c) 046 { 047 if(c<6) 048

_______________________; // 填空 049 else 050

f(x, r+1, 0);

051 } 052 053

void f(int x[][6], int r, int c) 054 { 055 if(r==6) 056 { 057

if(CheckStoneNum(x)) 058 { 059 N++; 060

show(x); 061 } 062 return; 063 } 064 065

if(______________) // 已经放有了棋子 066 { 067

GoNext(x,r,c); 068 return; 069 } 070 071

int rr = GetRowStoneNum(x,r); 072

int cc = GetColStoneNum(x,c); 073 074

if(cc>=3) // 本列已满

075

GoNext(x,r,c); 076

else if(rr>=3) // 本行已满 077

f(x, r+1, 0); 078 else 079 { 080

x[r][c] = 1; 081

GoNext(x,r,c); 082

x[r][c] = 0; 083 084

if(!(3-rr >= 6-c || 3-cc >= 6-r)) // 本行或本列严重缺子,则本格不能空着! 085

GoNext(x,r,c); 086 } 087 } 088 089

int main(int argc, char* argv[]) 090 { 091

int x[6][6] = { 092

{1,0,0,0,0,0}, 093

{0,0,1,0,1,0}, 094

{0,0,1,1,0,1}, 095

{0,1,0,0,1,0}, 096

{0,0,0,1,0,0}, 097

{1,0,1,0,0,1}

098}; 099 100

f(x, 0, 0); 101 102

printf(\ 103 104 return 0; 105 }

第八题:

编程题:这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。 变换的过程如下:

第一步. 把字符串6个一组折叠起来,比如wangximing则变为: wangxi ming

第二步. 把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:

228 202 220 206 120 105

第三步. 再把每个数字“缩位”处理:就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。例如: 228 => 2+2+8=12 => 1+2=3 上面的数字缩位后变为:344836, 这就是程序最终的输出结果! 要求程序从标准输入接收数据,在标准输出上输出结果。

输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。

输出格式为:n行变换后的6位密码。 第九题:

足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。

假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表: 甲 乙 丙 丁 甲 – 0.1 0.3 0.5 乙 0.9 – 0.7 0.4 丙 0.7 0.3 – 0.2 丁 0.5 0.6 0.8 –

数据含义:甲对乙的取胜概率为0.1,丙对乙的胜率为0.3,…

现在要举行一次锦标赛。双方抽签,分两个组比,获胜的两个队再争夺冠军。(参见【1.jpg】)

请你进行10万次模拟,计算出甲队夺冠的概率。 第十题:

串“abcd”每个字符都向右移位,最右的移动到第一个字符的位置,就变为“dabc”。这称为对串进行位移=1的轮换。同理,“abcd”变为:“cdab”则称为位移=2的轮换。 下面的代码实现了对串s进行位移为n的轮换。请补全缺失的代码。 void shift(char* s, int n) {

char* p; char* q;

int len = strlen(s); if(len==0) return;

if(n<=0 || n>=len) return;

char* s2 = (char*)malloc(_________); p = s;

q = s2 + n % len; while(*p) {

*q++ = *p++; if(q-s2>=len) {

*q = ___________; q = s2; } }

strcpy(s,s2); free(s2); }

本文来源:https://www.bwwdw.com/article/e1hx.html

Top