总结的常用函数(持续更新)

感觉其实(大部分)算法挺难的,这里准备先搞一下各函数c++的替换版本,毕竟不可能一场比赛又用c++又用java

数字与字符串互转也要整理一下

目录

1.字典序排列

2.连续子串查找

3.string 类用 strcmp系列

4.sort排序

5.c++数位操作

6.java进制转换,刚刚看到的补充一下

7 c++二分函数

8.c++输入

The End.封装的函数



1.字典序排列

            升序 next_permutation(a,a+n) ;                      ……字符数组

            降序 prev_permutation(a.begin(),a.end());      ……string类

没想到其实这里就已经接触到迭代器(a.begin())了,不过理解成指针也没什么问题

ps:本文函数区间都是左闭右开区间

头文件:#include<algorithm>

返回值:true/false//不是很理解为什么要这样返回

补充:  对于next_permutation(a,a+n) ;该函数是寻找该范围内数组组合下一个大一点的字典数

          如果还有满足条件的组合 就返回true  否则则返回false

2.连续子串查找

a.find([b[i]])                  返回b[i]在a数组中的下标

a.find(b)                       在string a 中寻找 string b

头文件:#include<string>

返回值:string::npos (失败) or b[i]在a数组中的下标(成功)

记住这个:

string::npos //失败的条件

3.string 类用 strcmp系列

string类转成字符数组类//这个不怎么用就没记,不记得了来查查

strcmp(a.c_str(),b.c_str());

加上c_str()就好了

4.sort排序

sort(a,a+n)                          //升序 head: #include<algorithm>

sort(a,a+n,greater<int>())   //降序    head:#include<functional>

5.c++数位操作

 这一部分比较基础而且重要,单独写一篇

数位操作

6.java进制转换,刚刚看到的补充一下

(Integer.toXXXString(待转换十进制数,转换后进制)

String s = Integer.toString(1000,8);//将1000转成八进制

10转2    Binary

如:

String s = Integer.toBinaryString(1000);//将1000转成2进制

下同 

10转8    Octal

10转16   Hex

10转x      上面的方法

x进制字符串s转10进制

    //String s = "10101";
	//
	//System.out.println(Integer.parseInt(s,x));
	//

附上链接:

java进制转换

里面的评论还是很有用的

 

7 c++二分函数

测试代码

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<stack>
#include<algorithm>
#include<string>
using namespace std;

typedef unsigned long long ull;
const ull MOD=0x3f3f3f3f3f;
const double PI=3.1415926;

int a[100000];
int b[100];
//string a,b;
int main()
{
    while(1)
    {
        int n;
        cout<<"请输入"<<endl;
        cin>>n;
        if(n==0)
            break;
        int i,j,k;
        for(i=0; i<n; i++)
            cin>>a[i];
        sort(a,a+n);
        for(i=0; i<n; i++)
            cout<<a[i]<<" ";
        cout<<endl<<"输入查找数字"<<endl;
        int findit;
        cin>>findit;
        cout<<"贰分查找"<<binary_search(a,a+n,findit)<<endl;
        cout<<"大于等于查找"<<lower_bound(a,a+n,findit)-&a[0]+1<<endl;
        cout<<"大于查找"<<upper_bound(a,a+n,findit)-&a[0]+1<<endl;
        cout<<"请选择"<<endl;
        //cin>>n;

    }

    return 0;
}

binary_search   返回真假  只能判断是否存在

下面两个返回指针

通常减去首地址后+1得到目标数下标

lower_bound  名字很奇怪  不过理解为不小于函数 还是很容易记下的

upper_bound  就是寻找大于传入值函数

8.c++输入

这里分为字符数组类和string类

两个相似的字符数组类输入函数(都支持录入空格)

1.

char a;
char str[100];
cin.get(a);
cin.get(str,20,'a');//字符数组名称   最多接受个数  结束字符(不录入)

2.

cin.getline(str,20,'a');//字符数组名称   最多接受个数  结束字符(不录入)
//和上面一样   不知道为什么会有两个这么相似的

一个支持string类的输入函数

string str;
getline(cin,str,'a');//cin   字符数组名称   结束字符(不录入)

9.反转函数reverse

对string 和char s[100010]都有用

但是返回值不是一个数组或string字符串  这个函数也只是一个操作函数

所以诸如

a=reverse(a.begin(),a.end());

这种写法是错的  因为类型不匹配

正确代码

int main()
{
	string a;
	cin>>a;
	reverse(a.begin(),a.end());
	cout<<a<<endl;	
	return 0;
}

The End.封装的函数

自己积累的一些封装函数,与上文编译器封装的做区别

1.最大公因数/最小公倍数

#include<cstdio>
#include<iostream>

using namespace std;
int gcd(int x,int y)//xy比ab好记一些
{
    return y==0?x:gcd(y,x%y);
}
int main()
{
	cout<<"请输入两个数"<<endl;
	int m,n;
	cin>>m>>n;
	//不用管  ab哪个大就是爽
	cout<<gcd(m,n);
	return 0;
}
//最大公倍数用m*n除以此结果即可

2.快速幂/快速乘(原理是模拟二进制计算)//这次不会再忘了

int pow_plus(int a,int b)//快速乘
{
    int ans = 0;
    while(b)
    {
        //cout<<"每轮打印"<<endl;
        //cout<<a<<" "<<b<<" "<<ans<<endl;
        if(b & 1 )//如果b是偶数
        {
            ans += a;
        }
        a += a;
        b >>= 1;
    }
    return ans;
}
int time_plus(int a,int b)//快速幂
{
    int ans = 1;
    cout<<a<<" "<<b<<endl;
    while(b)
    {
        if(b & 1 )//如果b是偶数
        {
            ans *= a;
        }
        a *= a;
        b >>= 1;
    }
    return ans;
}

原理一致,代码出奇的一致

幂的初值为1

乘的初值为0(加法模拟计算) 

复习链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值