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 就会异常,目前没De出来,回头在更新, mark!