int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
浮点数二分模板
// 浮点数二分算法模板
bool check(double x) {/* … */} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
大整数加法模板
vector add(vector &a, vector &b)
{
vector c;
int up = 0;
for (int i = 0; i < a.size() || i<b.size(); ++i)
{
if (i < a.size())
up += a[i];
if (i < b.size())
up += b[i];
c.push_back(up % 10);
up /= 10;
}
while (up>0)
{
c.push_back(up % 10);
up /= 10;
}
return c;
}
大整数减法模板
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
#include
#include
using namespace std;
bool cmp(vector &a, vector &b)
{
if (a.size() != b.size())
return a.size() > b.size();
for (int i = a.size() - 1; i >= 0; --i)
if (a[i] != b[i])
return a[i] > b[i];
return true;
}
vector sub(vector &a, vector &b)
{
vector c;
for (int i = 0, up = 0; i < a.size(); ++i)
{
up = a[i] - up;
if (i < b.size())
up = up - b[i];
c.push_back((up + 10) % 10);
if (up < 0)
up = 1;
else
up = 0;
}
while(c.size()>1&&c.back()==0)
c.pop_back();
return c;
}
int main()
{
string a, b;
vector A, B;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; --i)
A.push_back(a[i] - ‘0’);
for (int i = b.size() - 1; i >= 0; --i)
B.push_back(b[i] - ‘0’);
if(cmp(A,B))
{
auto C=sub(A,B);
for (int i = C.size() - 1; i >= 0; --i)
printf(“%d”, C[i]);
}
else
{
printf(“-”);
auto C=sub(B,A);
for (int i = C.size() - 1; i >= 0; --i)
printf(“%d”, C[i]);
}
cout << endl;
return 0;
}
高精度乘法模板
给定两个正整数A和B,请你计算A * B的值。