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