1、整型越界问题
在编程过程中经常会遇到输出值在类型区间之外,越界的情况,解决方法如下
- 转为log求解
改变数据类型,如int转为long long扩大整型边界
long long本质上还是整型,只不过是一种超长的整型。
int型:32位整型,取值范围为-2^31 ~ (2^31 - 1) .
long:在32位系统是32位整型,取值范围为-2^31 ~ (2^31 - 1);在64位系统是64位整型,取值范围为-2^63 ~ (2^63 - 1)
long long:是64位的整型,取值范围为-2^63 ~ (2^63 - 1)使用大树方法进行运算(这个有点难,需要仔细琢磨)
2、各种输入分析
1、一行包括多个数据,数据个数知道,用空格分开
vector<int> input;
while(n--)
{
int a;
cin>>a;
input.push_back(a);
}
2、输入未知行数的字符串
string a;
vector<string> aa;
while(cin>>a)
{
aa.push_back(a);
a.clear();
}
3、输入行数已知的成对值
vector<pair<int,int>> input;
while(n--)
{
int a,b;
cin>>a>>b;
input.push_back(make_pair(a,b));
}
4、输入用空格隔开未知个数的数字
vector<int> input;
int main()
{
int n;
while (getchar()!='\n')
{
scanf_s("%d", &n);
input.push_back(n);
}
}
3、vector等容器的各种处理
1、逆序
reverse(a.begin(),a.end())
2、排序
sort(a.begin(),a.begin())
如果是pair类型的未指定排序方式时,默认按first从小到大排序
3、查找某个特定字符出现的位置
int index = input.find('a');//从前往后的第一个
int index = input.rfind('a')//从后往前查的倒数第一个
4、获得从某个字符开始的子串
string a,b;
string input;
//substr是左包右不包的区间
a = input.substr(index);//即从index开始往最后
b = input.substr(0,index);//即[0,index)区间
5、查找最大值
int max = *max_element(a.begin(),a.end());//调用函数
6、删除第i个数据
a.erase(a.begin()+i);
7、在指定位置插入某个值(可用于逆序输出链表)
result.insert(result.begin()+i,head->val);//实现在容器的第i位插入数值
4、杨辉三角的使用
杨辉三角的第i行第j个数值其实就是从i个数中提取j个数的所有情况(不考虑先后顺序),及Cij。构建杨辉三角:
int c[100][100]
int init()
{
c[0][0]=1;
for(int i=1;i<100;i++)
{
c[i][0]=1;
for(int j=1;j<100;j++)
{
c[i][j]=c[i-1][j-1]+c[i-1]c[j]
}
}
}
使用案例:
在x个质量为A的苹果和y个质量为B的香蕉中挑选搭配出重量为k的水果,问有多少中方案?
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
if(A*i+B*j==k)
count+=c[x][i]+c[y][j];
}
}