欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[Coursera C程序设计进阶] 期末考试

程序员文章站 2022-05-19 14:23:12
...

编程题#1:含k个3的数

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

输入二个正整数m 和 k,其中1 < m < 100000,1 < k <5 ,判断m 能否被19整除,且恰好含有k个3,如果满足条件,则输出YES,否则,输出NO。

例如,输入:

43833 3

满足条件,输出YES

如果输入

39331 3

尽管有3个3,但不能被19整除,也不满足条件,应输出NO

输入

m 和 k 的值,空格间隔

输出

满足条件时输出 YES,不满足时输出 NO

样例输入


1
43833 3

样例输出


1
YES
#include<iostream>
#include <cstdlib>
using namespace std;

int main() {
	int n, k;
	cin >> n >> k;
	int count = 0;
	if (n / 10000 == 3) count++; 
	if ((n%10000)/1000 == 3) count++;
	if (((n % 10000) % 1000) / 100 == 3) count++;
	if ((((n % 10000) % 1000) %100) / 10 == 3) count++;
	if (((((n % 10000) % 1000) % 100)%10) /1 == 3) count++;

	if (count == k&&n % 19 == 0) {
		cout << "YES" << endl;
	}
	else {
		cout << "NO" << endl;
	}




	return 0;



}

编程题#2:字符串中次数第2多的字母

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

输入一串长度不超过500个符号的字符串,输出在串中出现第2多的英语字母(大小写字母认为相同)和次数(如果串中有其它符号,则忽略不考虑)。如果有多个字母的次数都是第2多,则按串中字母出现的顺序输出第1个。

例 ab&dcAab&c9defgb

这里,a 和 b都出现3次,c和d都出现2次,e、f 和 g 各出现1次,其中的符号&和9均忽略不考虑。因此,出现第2多的应该是 c 和 d,但是 d 开始出现的位置在 c 的前面,因此,输出为

D+d:2

(假定在字符串中,次数第2多的字母总存在)

输入

一个字符串

输出

大写字母+小写字母:个数

样例输入


1
ab&dcAab&c9defgb

样例输出


1
D+d:2
#include<iostream>
#include <cstdlib>
#include <cstring>
#include <vector>
int n = 0;
using namespace std;
char* letter(char *str) {//过滤字母外的东西
	int i = 0, j = 0;
	static char newstr[500];
	char *p;
	char tmp;
	p = newstr;
	while (*(str + i) != '\0') {
		tmp = *(str + i);
		if ((tmp >= 'A' && tmp <= 'Z') || (tmp >= 'a' && tmp <= 'z')) {
			*(p + j) = tmp;
			j++;
			n++;
		}
		i++;
	}
	return newstr;
}
int k = 0;//出现的字母个数  

struct alpha {//用于保存出现的字母以及其个数  
	char letter;
	int time;
};
alpha strOut[500] = { '\0' };
int deal(char input) {//对于字母,进行处理,  
	bool find = false;
	for (int i = 0; i < k + 1; i++) {//出现过的字母,个数+1  
		if (input == strOut[i].letter) {
			find = true;
			strOut[i].time++;
			break;
		}
	}
	if (find == false) {//没出现过的字母,进行初始化,保存其字母,出现次数设定为1  
		strOut[k].letter = input;
		strOut[k].time = 1;
		k++;
	}
	return 0;
}
int main() {
	char str[500] = { '\0' };
	cin.getline(str, 500);
	int m = strlen(str);
	char *newstr;
	newstr = letter(str);
	for (int i = 0; i < m; i++) {
		if(newstr[i]>= 'A'&&newstr[i] <= 'Z') newstr[i] +=32;//转换大小写
	}

	for (int i = 0; i < 501; i++) {
		if (newstr[i] == '\0')
			break;
		else {
			deal(newstr[i]);
			}
		}
	
	

	
	alpha larggest = { ' ',0 };
	alpha second = { ' ',0 };
	for (int i = 0; i < k - 1; i++) {//通过最大值和次大值两个变量,最后找到次大值  
		if (strOut[i].time > larggest.time) {
			second = larggest;
			larggest = strOut[i];
		}
		else if (strOut[i].time > second.time&& strOut[i].time < larggest.time) {
			second = strOut[i];
		}
	}
	char temp = second.letter - 32;
	cout << temp << '+' << second.letter << ':' << second.time;


	return 0;



}

编程题#3:运算符判定

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

两个整数 a 和 b 运算后得到结果 c。表示为:a ? b = c,其中,?可能是加法 +,减法 -,乘法 *,整除 / 或 取余 %。请根据输入的 a,b,c 的值,确定运算符。如果某种运算成立,则输出相应的运算符,如果任何运算都不成立,则输出 error.

例如:

输入:

3,4,5

输出:

error

若输入:

3,4,3

则输出:

%

输入

a b和 c 的值在意行内输入,以逗号间隔

输出

五个运算符之一或 error

样例输入


1
6,7,13

样例输出


1
+
#include<iostream>

using namespace std;


int main() {
	char slash1;
	char slash2;
	int a, b, c;
	cin >> a >>slash1>> b>>slash2 >> c;
	if (a + b == c)cout << "+" << endl;
	else if (a - b == c)cout << "-" << endl;
	else if (a * b == c)cout << "*" << endl;
	else if (a / b == c)cout << "/" << endl;
	else if (a % b == c)cout << "%" << endl;
	else { cout << "error" << endl; }

	return 0;
}

编程题#4:寻找平面上的极大点

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b;

用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。

给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。

编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标。

本题规定:n不超过100,并且不考虑点的坐标为负数的情况。

输入

输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的坐标,坐标值都是整数,坐标范围从0到100,输入数据中不存在坐标相同的点。

输出

按x轴坐标最小到大的顺序输出所有极大点。

输出格式为:(x1,y1),(x2,y2),...(xk,yk)

注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错

样例输入


1
2
5
1 2 2 2 3 1 2 3 1 4

样例输出


1
(1,4),(2,3),(3,1)

提示

#include<iostream>  
using namespace std;  
struct point {//用以记录每一个点  
    int x;//横坐标  
    int y;//纵坐标  
};  
int main() {  
    int n;  
    cin >> n;  
    point points[100];//从来接受所有的点  
    for (int i = 0; i < n; i++)   
        cin >> points[i].x >> points[i].y;  
    point maxs[100];//用来保存所有的极大点  
    int k = 0;  
    for (int i = 0; i < n; i++) {  
        bool max = true;//初始化这个点没有被支配  
        for (int j = 0; j < n; j++) {  
            if (j== i)  
                continue;  
            else if (((points[j].x >= points[i].x)&&(points[j].y >= points[i].y)) == true)//判断是否被支配,如果支配,则将max改为假  
                max = false;  
        }  
        if (max == true) {//把没有被支配的点保存下来  
            maxs[k] = points[i];  
            k++;  
        }  
    }  
    k--;//因为之前最后一次多了一个k++,所以这里-回来  
    for (int i = 0; i < k + 1; i++) {//排序  
        for (int j = i+1; j < k + 1; j++) {  
            if (maxs[i].x > maxs[j].x) {  
                point temp = maxs[i];  
                maxs[i] = maxs[j];  
                maxs[j] = temp;  
            }  
            else if (maxs[i].x == maxs[j].x&&maxs[i].y > maxs[j].y) {  
                point temp = maxs[i];  
                maxs[i] = maxs[j];  
                maxs[j] = temp;  
            }  
        }  
    }  
    for (int i = 0; i < k+1 ; i++) {//输出,最后一次没有,  
        cout << '(' << maxs[i].x << ',' << maxs[i].y << ')';  
        if (i == k)  
            cout << endl;  
        else  
            cout << ',';  
    }  
    return 0;  
}  

WA but with right output:

#include<iostream>
#include <vector>  
#include <iomanip> 
using namespace std;

typedef struct coord
{
	int x;
	int y;
	int flag;
};

int main() {
	int n;
	cin >> n;
	int save[200] = {0};
	vector<coord> d(n);
	for (int i = 0; i < 2*n; i++) {
		cin >> save[i];
	}
	for (int i = 0; i <  n; i++) {
		d[i].x = save[2*i];
		d[i].y = save[2 * i + 1];
	}
	for (int i = 0; i < n; i++) {
		int count = 0;
		
		for (int j = 0; j < n; j++) {
			if (d[i].x > d[j].x || d[i].y > d[j].y)count++;
				
		}
		if (count==n-1)d[i].flag = 1;
	}

	for (int i = 0; i < n - 1; i++) {
		for (int j = 1; j < n - i; j++) {
			if (d[j - 1].x > d[j].x) {
				int temp = d[j].x;
				d[j].x = d[j - 1].x;
				d[j - 1].x = temp;
				int temp1 = d[j].y;
				d[j].y = d[j - 1].y;
				d[j - 1].y = temp1;
				int temp2 = d[j].flag;
				d[j].flag = d[j - 1].flag;
				d[j - 1].flag = temp2;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		if (d[i].flag == 1) {
			cout << '(' << d[i].x << ',' << d[i].y << ')';
			if (i == n-1)
				cout << endl;
			else
				cout << ',';
		}
	}
	
	system("pause");
	return 0;
}

编程题#5:走出迷宫

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入

第一行是两个整数n和m(1 <= n,m <= 100),表示迷宫的行数和列数。

接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。

输出

输出从起点到出口最少需要走的步数。(你不能起出迷宫外)

参考答案:

#include <iostream>
#include <cstring>
using namespace std;

int m,n;//n行m列
char map[101][101];//地图矩阵
int already[101][101];//已走地图记忆
int min_count=0;

void cross(int u, int v, int i, int j)
{
    int t = already[u][v];
    if (u == i && v == j)//起点即为到达终点
    {
        min_count = t;
    }
    t++;

    if (v < m - 1 && map[u][v+1] != '#'  && already[u][v+1]>t)//在迷宫内、右侧非墙且此点没有走过
    {
        already[u][v+1] = t;//标记此点为第t步
        cross(u, v+1, i, j);//以此点为起点继续走
    }
    if (u > 0 && map[u-1][v] != '#'  && already[u-1][v]>t)
    {
        already[u-1][v] = t;
        cross(u-1, v, i, j);
    }
    if (v > 0 && map[u][v-1] != '#'  && already[u][v-1]>t)
    {
        already[u][v-1] = t;
        cross(u, v-1, i, j);
    }
    if (u < n - 1 && map[u+1][v] != '#' && already[u+1][v]>t)
    {
        already[u+1][v] = t;
        cross(u+1, v, i, j);
    }
}

int main() {
    int startx,starty,endx,endy;
    cin >> n >> m ;
    for (int i=0; i<n ; i++) {
        for (int j=0; j<m; j++) {
            cin >> map[i][j];
            if (map[i][j]=='S') {
                startx=i;
                starty=j;
            }
            if (map[i][j]=='T') {
                endx=i;
                endy=j;
            }
        }
    }
    memset(already,1,sizeof(already));//按字节为单位赋值:16843309
    already[startx][starty]=0;
    cross(startx,starty,endx,endy);
    cout <<min_count<<endl;
    return 0;
}