北京理工大学复试上机--2018

1、输入一个只含有英文字母的字符串,输出最大回文子串的长度及此长度回文子串的个数(回文不区分大小写)。
样例:
输入: aBaAb (最大回文子串为BaAb)
输出: 4 1
输入: aBcbBb (最大回文子串为Bcb和bBb)
输出: 3 2

输入: a B
输出: 1 2
输入: aBcbB
输出: 3 1
输入: aaaaaa
输出: 6 1

#include <iostream>
#include <string>
#include <map>
using namespace std;

bool isHw(string s) {
    int i, l;
    l = s.length();
    for (int i = 0; i < l / 2; i++) {
        if (toupper(s[i]) != toupper(s[l - i - 1])) return false;
    }
    return true;
}

int main() {
    string s;
    while (getline(cin, s)) {
        int i, j, maxl, num = 0;
        map<int, int> m;
        map<string, int> ms;//防止相同的回文串重复计数,按题目意思应该是统计同一长度不同的串
        maxl = 0;
        for (i = 0; i < s.length(); i++) {
            if(!isalpha(s[i])) continue;
            string str;
            for (j = i; j < s.length(); j++) {
                if(!isalpha(s[j])) {
                    str = "";
                    continue;
                }
                str += s[j]; 
                if (isHw(str) && ms[str] == 0) {
                    ms[str]++;
                    if (str.length() > maxl) maxl = str.length();
                    m[str.length()]++;
                }
            }
        }
        if(maxl != 0) cout << maxl << " " << m[maxl] << endl;
    }
    return 0;
}

2、哥德巴赫猜想
任何一个大于2的偶数均可表示为两个素数之和。输入m, n(6<=m<=n<=50),则把[m, n]内的所有偶数表示成两个素数之和的形式。输出这些素数及其出线的次数,输出次序按照素数出现的次数从多到少输出;若出线次数相同,按照素数从大到小输出;若偶数有多种素数相加形式,则把所有的情况都输出,每种情况占一行。

输入:
8 9
输出:
5 1 3 1

输入:
9 10
输出:
5 2
7 1 3 1

输入:
14 15
输出:
11 1 3 1
7 2

输入:
8 10
输出:
3 2 7 1 5 1
5 3 3 1

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> v;
map<int, int> mmp;

bool cmp(int a, int b) {
    if(mmp[a] == mmp[b]) return a > b;
    return mmp[a] > mmp[b];
}

bool isPrime(int n) {
    if(n == 1) return false;
    for(int i = 2; i <= n / 2; i++) {
        if(n % i == 0) return false;
    }
    return true;
}

void dfsPrime(int m, int n) {
    if(m >= n && !v.empty()) {
        sort(v.begin(), v.end(), cmp);
        map<int, int> op;
        for(int i = 0; i < v.size(); i++) {
            op[v[i]]++;
            if(op[v[i]] == 1 && mmp[v[i]] != 0) cout << v[i] << " " << mmp[v[i]] << " ";
        }
        cout << endl;
        return ;
    }
    else {
        if(m % 2 != 0) m++;
        for(int j = 2; j <= m / 2; j++) {
            if(isPrime(j) && isPrime(m - j)) {
                v.push_back(j);
                v.push_back(m - j);
                mmp[j]++;
                mmp[m - j]++;
                dfsPrime(m + 1, n);
                v.pop_back();
                v.pop_back();
                mmp[j]--;
                mmp[m- j]--;
            }
        }
    }
}

int main() {
    int m, n;
    while(cin >> m >> n) {
        dfsPrime(m, n);
    }
    return 0;
}

PS: 第二题当前用例正常,比如10 16 就会异常,目前没Debug出来,回头在更新, mark!

posted @ 2020-04-04 00:41  AlsoRan  阅读(834)  评论(0编辑  收藏  举报