[Coursera C程序设计进阶] 期末考试
编程题#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
样例输入
样例输出
#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多的字母总存在)
输入
一个字符串
输出
大写字母+小写字母:个数
样例输入
样例输出
#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
样例输入
样例输出
#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)
注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错
样例输入
样例输出
提示
#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;
}
上一篇: python中if __name__ == '__main__'
下一篇: C程序设计进阶_期末考试