常見算法攻克
- 一、素數
- 1. 素數判斷
- 2. 素數篩法
- 二、數據轉換
- 1. 字符串轉換
- 2. 進制轉換
- 三、字符串
- 1. 字符串替換
- 2. 其他題目
一、素數
1. 素數判斷
bool isPrime(int n)
{if (n < 2) return false;for (int i = 2; i * i <= n; i++){if (n % i == 0){return false;}}return true;
}
2. 素數篩法
void prime(int n)
{int isPrime[100005] = {};/* isPrime[]: 狀態數組0: 表示合數(被篩掉的)1: 表示質數 */memset(isPrime, 1, n*sizeof(int)); // 默認都是質數// 篩素數for (int i = 2; i <= sqrt(n); i++){if (isPrime[i] == 1) // 是質數{for (int j = i * i; j <= n; j += i) // 遍歷i從i開始的所有倍數{isPrime[j] = 0; // 篩掉i的倍數j }}}// 輸出for (int i = 2; i <= n; i++){if (isPrime[i] == 1){cout << i << " ";}}
}
二、數據轉換
1. 字符串轉換
函數 | 功能 |
---|---|
to_string | 將各種數據類型轉換為字符串 |
stoi | 將字符串轉換為整數 |
stol | 將字符串轉換為長整數 |
stoll | 將字符串轉換為長長整數 |
stof | 將字符串轉換為浮點數 |
stod | 將字符串轉換為雙精度浮點數 |
stold | 將字符串轉換為長雙精度浮點數 |
2. 進制轉換
2.1 將 x x x 進制轉換為 10 10 10 進制
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;int n;
int len;
int base;
char num[15];
int num2[15];
long long sum;int main()
{cin >> n;while (n--){// 輸入cin >> base >> num;// 轉十進制數len = strlen(num);sum = 0;// 1. 轉對應數字for (int i = 0; i < len; i++){if (num[i] >= '0' && num[i] <= '9'){num2[i] = num[i] - '0';}else{num2[i] = 10 + (num[i] - 'A');}}// 2. 權值展開求和for (int i = 0; i < len; i++){sum += num2[i] * pow(base, len-i-1);}// 輸出cout << sum << endl;}return 0;
}
2.2 將 10 10 10 進制轉換為 x x x 進制
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;int n;
int base;
int num;
char result[15];int main()
{cin >> n;while (n--){// 輸入cin >> base >> num;// 轉 x 進制數int len = 0;// 1. 求各位數字while (num > 0){int remainder = num % base;if (remainder < 10){result[len] = remainder + '0';}else{result[len] = remainder - 10 + 'A';}num /= base;len++;}// 2. 反轉得到 x 進制數for (int i = len - 1; i >= 0; i--){cout << result[i];}cout << endl;}return 0;
}
三、字符串
1. 字符串替換
#include <iostream>
#include <string>
#include <map>
using namespace std;int n;
string a, b;
string tmp;
string s, ans;
map<string, string>m;int main()
{// 輸入cin >> n;for (int i = 1; i <= n; i++){cin >> a >> b;m[a] = b;}cin >> s;s += '.'; // 結束符for(char c : s){if (c >= 'a' && c <= 'z'){tmp += c;}else{if (tmp != ""){if (m.count(tmp)){ans += m[tmp];}else{ans += "UNK";}tmp = ""; }ans += c;}}ans.pop_back();// 輸出cout << ans;return 0;
}
2. 其他題目
一般都是純枚舉、純模擬、純暴力,記得分情況討論,特例先行(大不了暴力嘛 )。就比如相似字符串。