C/C++ (12月第二週)
第一題:含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;
}