常用C++模版

本文介绍了如何在C++中进行字符串和整数的转换,包括stringstream的应用,以及10进制与n进制之间的转换方法。此外,还涵盖了低位操作、Miller-Rabin素数判断、快速幂、最大公约数和最小公倍数的计算,以及并查集数据结构的实现。
摘要由CSDN通过智能技术生成


本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。
因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。
违者必究,谢谢配合。
个人主页:blog.csdn.net/jzwalliser

前言

学完Python后再学C++,会有一种神奇的感觉,因为许多Python的内置函数用的很方便,但C++都没有,需要自己写,如整数和字符串的转换。这篇文章中,就一起看看常用函数的写法吧!

类型转换

string 转 int

网上有许多int和string互转的方法,但在我看来都挺繁琐。使用stringstream其实最方便。

#include<sstream> //必须导入sstream或bits/stdc++库
int to_int(string str){
	stringstream ss; //创建stringstream流
	int num;
	ss << str; //str流入stringstream
	ss >> num; //stringstream流入num
	return num;
}

int 转 string

#include<sstream> //必须导入sstream或bits/stdc++库
string to_str(long long int num){
	stringstream ss; //创建stringstream流
	string str;
	ss << num; //num流入stringstream
	ss >> str; //stringstream流入str
	return str;
}

进制转换

10进制转n进制( 2 ≤ n ≤ 16 , n ∈ Z 2\leq n\leq 16,n\in \mathbb Z 2n16,nZ

用于将10进制的数转换位n进制。

string dec_to_m(int n,int m){ //十进制数n转m进制
	string digit = "0123456789ABCDEF"; //位数
	if(n == 0){ //如果除完了
		return "";
	}
	
	return dec_to_m(n / m,m) + digit[n % m]; //依次相除并添加位数
}

n进制转10进制( 2 ≤ n ≤ 16 , n ∈ Z 2\leq n\leq 16,n\in \mathbb Z 2n16,nZ

用于将n进制的数转换为10进制。

long long int n_to_dec(string m,int base){ //base进制的数字m
	reverse(m.begin(),m.end()); //将数字反转过来,方便遍历
	long long int ans = 0; //十进制的数
	for(int i = 0;i < m.size();i++){ //遍历每一位
		int digit; //当前位
		if('0' <= m[i] and m[i] <= '9'){ //将字符转换为整数
			digit = m[i] - '0';
		}
		else if('A' <= m[i] and m[i] <= 'Z'){ //如果是16进制则需要处理字母
			digit = m[i] - 'A' + 10;
		}
		else if('a' <= m[i] and m[i] <= 'z'){ //如果是16进制则需要处理字母
			digit = m[i] - 'a' + 10;
		}
		ans += pow(base,i) * digit; //依次累加
	}
	return ans;
}

数学

lowbit

利用二进制的特性,可以将数字的二进制表示法最末尾的 1 1 1取出来。

int lowbit(int num){
	return num & (-num);
}

Miller-Rabin 判断素数

bool prime(long long int n){
	if(n <= 1){ //如果是1或0则不是素数
		return false;
	}
	
	for(long long int i = 2;i <= sqrt(n);i++){ //从2开始枚举到sqrt(n)
		if(n % i == 0){ //如果里面有n的因数则n不是素数
			return false; //可以结束函数的运行了
		}
	}
	return true; //是素数
}

快速幂

long long int fastpow(int a,int n){
	long long int ans = 1;
	while(n){
		if(n & 1){ //当前位需要乘
			ans *= a;
		}
		a *= a; //平方
		n = n >> 1; //将n右移一位
	}
	return ans;
}

最大公约数

int gcd(int a,int b){
	if(b){
		return gcd(b,a % b);
	}
	return a;
}

最小公倍数

int gcd(int a,int b){
	if(b){
		return gcd(b,a % b);
	}
	return a;
}

int lcm(int a,int b){
	return a * b / gcd(a,b);
}

其它算法

并查集

const int N = 10005;
int s[N];
void init(){ //初始化
	for(int i = 1;i <= N;i++){
		s[i] = i;
	}
}
int find(int x){ //查找
	if(x != s[x]){
		s[x] = find(s[x]); //路径压缩
	}
	return s[x];
}

void merge(int x,int y){
	x = find(x);
	y = find(y);
	if(x != y){
		s[x] = s[y];
	}
}

结尾

以上就是几个常用的C++模板了,也许在哪里会用到呢。
大家还想要什么模板呢?评论区见~
给个赞再走哦~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值