C++编程小技巧

1、整型越界问题
在编程过程中经常会遇到输出值在类型区间之外,越界的情况,解决方法如下

  1. 转为log求解
  2. 改变数据类型,如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)

  3. 使用大树方法进行运算(这个有点难,需要仔细琢磨)

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];
    }
}

猜你喜欢

转载自blog.csdn.net/zllljf/article/details/82224067