1. 程式人生 > >C/C++ (12月第二週)

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;
}