第一题:含k个3的数
输入两个正整数 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。
样例输入
43833 3
样例输出
YES
第二题:字符串中次数第2多的字母
描述
输入一串长度不超过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多的字母总存在)
输入
一个字符串
输出
大写字母+小写字母:个数
样例输入 ab&dcAab&c9defgb
样例输出 D+d:2
第三题:运算符判定
两个整数 a 和 b 运算后得到结果 c。表示为:a ? b = c,其中,?可能是加法 +,减法 -,乘法 *,整除 / 或 取余 %。请根据输入的 a,b,c 的值,确定运算符。如果某种运算成立,则输出相应的运算符,如果任何运算都不成立,则输出 error.
例如:
输入:
3,4,5
输出:
error
若输入:
3,4,3
则输出:
%
输入
a b和 c 的值在意行内输入,以逗号间隔
输出
五个运算符之一或 error
样例输
6,7,13
样例输出
+
第四题
在一个平面上,如果有两个点(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)
注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错
样例输入
5
1 2 2 2 3 1 2 3 1 4
样例输出
(1,4),(2,3),(3,1)
第五题:走出迷宫
描述
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
输入
第一行是两个整数n和m(1 <= n,m <= 100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口。
输出
输出从起点到出口最少需要走的步数。(你不能起出迷宫外)
样例输入
3 3
S#T
.#.
...
样例输出
6
第一题题解:
#include<iostream>
using namespace std;
int main(){
int m,k,temp,flag=0;
cin >> m >> k;
temp = m;
while(temp > 0){
if (temp %10 ==3) ++flag;
temp /=10;
}
if(m%19 == 0 && flag == k)
cout << "YES"<< endl;
else
cout<<"NO"<< endl;
return 0;
}
第二题解:初步思路首先用一个字符数组a[]装输入, 然后把 大小写字母归为一类,用一个字符数组coun[]计数.然后遍历这个数组求出第二大出现次数的字母(本文采用的方法是求出出现次数最多的字母,把它变成零,再求最多出现次数的字母,此时就是第二出现次数的字母),最后在a[]里找到最先出现的第二大字母,就可以了
#include<iostream>
using namespace std;
int main(){
char a[500];
int coun[26] = {0};
cin >> a;
for(int i = 0;a[i] != '\0';++i){
if(a[i] >=65 && a[i] <=90 )
++coun[a[i]-65];
else if(a[i] >=97 && a[i] <= 122 ){
++coun[a[i] -97];
a[i] -= 32;
}
}
int fmax=0,smax=0;
for(int i=0; i<26; ++i)
if(coun[fmax] <= coun[i])
fmax = i;
for(int i=0; i<26; ++i)
if(coun[i] == coun[fmax])
coun[i] = 0;
for(int i =0; i<26; ++i)
if(coun[smax] <= coun[i])
smax=i;
int num = coun[smax];
for(int i =0; a[i] != '\0';++i){
if(coun[a[i] -65] == num)
{cout << char(a[i])<< "+" << char(a[i]+32) << ":"<< num<<endl;break;}
}
return 0;
}
第三题解:5个判断就行了
#include<iostream>
using namespace std;
int main(){
int a,b,c;
char commom;
cin >> a >> commom >> b >> commom >> 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;
}
第四题解:使用结构体定义比较方便,也可以使用二维数组,不过在代码上比较长而已
思路流程如下:定义结构体——输入——找极大值(用两个循环即可)——对极大值进行排序——输出
#include<iostream>
using namespace std;
struct student{
int x;
int y;
}; // we use struct to definition
int main(){
int n ;
cin >> n;
student point[100];
for(int i=0; i<n; ++i)
cin >> point[i].x >>point[i].y; //input data
student maxs[100]; // store maxima
int a=0;//store the number of maxima
for(int i=0; i<n; ++i){ // find maxima
bool flag = true;
for(int j=0; j<n; ++j){
if(j == i)
continue;
else if(((point[j].x >= point[i].x)&&(point[j].y >= point[i].y)) == true)
{flag = false;break;}
}
if (flag == true)
maxs[a++] = point[i];
}
for(int i=0; i<a; ++i){ // using bubble Sorting algorithm
for(int j=0; j<a-i-1; ++j){
if(maxs[j].x > maxs[j+1].x || maxs[j].x==maxs[j+1].x && maxs[j].y > maxs[j+1].y){
student temp = maxs[j];
maxs[j] = maxs[j+1];
maxs[j+1] = temp;
}
}
}
for(int i=0;i<a;++i){ // input maxima
cout <<'(' << maxs[i].x << ',' << maxs[i].y <<')';
if(i==a-1)
cout << endl;
else
cout << ',';
}
return 0;
}
第五题题解:参考网上的源代码。这题用了一个递归函数求解,算法采用的是广度优先搜素算法,memset函数是一个功能性函数,具体可谷歌。在本题的作用是把数组所有的值赋值为一个很大的数。
#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 即把所有数组值赋为16843309
already[startx][starty]=0;
cross(startx,starty,endx,endy);
cout <<min_count<<endl;
return 0;
}