常见算法攻克
- 一、素数
- 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. 其他题目
一般都是纯枚举、纯模拟、纯暴力,记得分情况讨论,特例先行(大不了暴力嘛 )。就比如相似字符串。