算法题中的常用自定义函数
今天,我们来总结下算法题中常用的一些函数,这些函数需要我们自己去写的,现在来总结以下,方便以后做题的时候用。
1.判断素数
bool isPrime(int n)
{
bool flag = true;
if (n == 1 || n == 0)
{
flag = false;
}
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
flag = false;
}
}
return flag;
}
这个效率是很高的,节约了一般的时间,不用全部遍历,别忘了加上头文件 “include <cmath>”
2.判断闰年
闰年条件:
是4的倍数但不是100的倍数,或者是400的倍数
// 判断是否为闰年
bool isLeapYear(int y)
{
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
3.判断日期
const int month[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},//定义了二维数组,平年2月28天,闰年2月29天
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
// 判断是否为日期
bool isDate(int s) // s为日期,格式:yyyymmdd
{
int y, m, d;
bool flag = false;
y = s / 10000; // 得到年份
m = (s/100) % 100; // 得到月份
d = s % 100; // 得到日
if (y > 0 && m > 0 && m <= 12)
{
if (d <= month[isLeapYear(y)][m]) // 判断日期是否正确
{
flag = true;
}
}
return flag;
}
4.最大公因数和最小公倍数
// 最大公因数
//函数递归调用
int gcd(int a, int b) {
if (a % b == 0) {
return b;
}
else {
return gcd(b, a % b);
}
}
// 最小公倍数 = a * b / gcd(a, b);
k = a / gcd(a, b) * b;
5.判断回文
// 判断回文
bool isHW(int num)
{
int t = num, r = 0;
while (num)
{
r = r * 10 + num % 10; // 让r为num的逆序
num /= 10;
}
if (r == t)
return true;
else
return false;
}
6.求最长公共子序列长度 LCS
const int maxlen = 1010;
char s1[maxlen], s2[maxlen];
int dp[maxlen][maxlen]; // dp[i][j]为串s1的前i个字符和串s2的前j个字符的最大公共子串长度 0, ②
int main()
{
int i, j;
int len1, len2, ret; // ret记录结果
cin >> s1 >> s2;
memset(dp, 0 , sizeof(dp)); // 初始化,刚开始LCS长度均为0
len1 = strlen(s1) ;
len2 = strlen(s2);
ret = 0;
for (i = 0; i < len1; i++)
{
for (j = 0; j < len2; j++)
{
if (s1[i] == s2[j])
{
dp[i + 1][j +1] = dp[i][j] + 1;
}
else
{
dp[i + 1][j + 1] = 0;
}
ret = max(ret, dp[i + 1][j + 1]); // 随时更新最大值
}
}
cout << ret;
return 0;
}
meset 用法 : (string.h)
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
sizeof 用法: sizeof (data type) C++中的运算符
重点:
if (s1[i] == s2[j])
{
dp[i + 1][j +1] = dp[i][j] + 1;
}
else
{
dp[i + 1][j + 1] = 0;
}
ret = max(ret, dp[i + 1][j + 1]); // 随时更新最大值
以上就是本人总结的一部分,若有疑问,可以评论或者私聊我(如果觉得本文不错的话,请点个赞,哈哈哈)。