几个做题常用的函数 C/C++

y总的代码模板

判断素数

int isPrime(int n) {
	if (n < 2) return 0;
	for (int i = 2; i <= (int)sqrt(n); ++i)
		if (n % i == 0)
			return 0;
	return 1;
}

最大公约数

//递归
int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}

//循环
int gcd(int a, int b) {
	while(b ^= a ^= b ^= a %= b;
	return a;
}

最小公倍数

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

斐波那契

int fabonaci(int n) {
	if (n == 0 || n == 1)
		return n;
	return fabonaci(n - 1) + fabonaci(n - 2);
}

约瑟夫环

int ysf(int n, int m) {
	return n == 1 ? 0 : (ysf(n - 1, m) + m) % n;
}

#按顺序输出出圈编号
int ysf(int n, int m, int k) {
	return k == 1 ? (n + m - 1) % n : (ysf(n - 1, m, k - 1) + m) % n;
}
for (int i = 1; i <= n; ++i)
	cout << ysf(n, m, i) + 1 << endl;
####################################################
int main()
{
    int n, m, i, s = 0;
    cin >> n >> m;
    for (i = 2; i <= n; i++)
    {
        s = (s + m) % i;
    }
    cout << s + 1;
}

进制转换

任意进制转化为10进制

int Atoi(string s,int radix)    //s是给定的radix进制字符串
{
	int ans=0;
	for(int i=0;i<s.size();i++)
	{
		char t=s[i];
		if(t>='0'&&t<='9') ans=ans*radix+t-'0';
		else ans=ans*radix+t-'a'+10;
	}
		return ans;
}

10进制转换为任意进制

内置函数:
itoa(num, str, 2); num是一个int型的,是要转化的10进制数,str是转化结果,后面的值为目标进制。【c++中一般用_itoa】

string intToA(int n,int radix)    //n是待转数字,radix是指定的进制
{
	string ans="";
	do{
		int t=n%radix;
		if(t>=0&&t<=9)	ans+=t+'0';
		else ans+=t-10+'a';
		n/=radix;
	}while(n!=0);	//使用do{}while()以防止输入为0的情况
	reverse(ans.begin(),ans.end());
	return ans;	
}

c++按指定进制输出

#include <bitset>  
#include<iostream>
using namespace std;  
int main()  
{  
    cout << "35的8进制:" << std::oct << 35<< endl;  
    cout << "35的10进制" << std::dec << 35 << endl;  
    cout << "35的16进制:" << std::hex << 35 << endl;  
    cout << "35的2进制: " << bitset<8>(35) << endl;      //<8>:表示保留8位输出
    return 0;  
} 

十进制转二进制

void dectobin(int n) {
	if (n == 0 || n == 1)
		cout << n;
	else {
		dectobin(n / 2);
		cout << n % 2;
	}
}

二进制转十进制

int toten(int x){
     int ans = 0, cnt = 0;
     while(x){
         ans += (pow(2,cnt++) * (x % 10));
         x /= 10;
     }
     return ans;
 }
 ###########################################
int toten(string s) {
	int ans = 0, len = s.size();
	for (int i = 0; i < len; ++i) {
		ans += ((s[i] - '0') * pow(2, len - i - 1));
	}
	return ans;
}

十进制转八进制

void dectooct(int n) {
    if (n >=0 && n < 8)
        cout << n;
    else {
        dectooct(n / 8);
        cout << n % 8;
    }
}

十进制转十六进制

string str="0123456789ABCDEF"
void dectohex(int n) {
    if (n >=0 && n < 16)
        cout << str[n];
    else {
        dectooct(n / 16);
        cout << str[n % 16];
    }
}

高精度加法

string add(string a, string b) {
	string c;
	int la = a.size(), lb = b.size();
	if (la < lb)			//前面补0
		for (int i = 0; i < lb - la; ++i)
			a = "0" + a;
	else
		for (int i = 0; i < la - lb; ++i)
			b = "0" + b;
	int tmp = 0;
	for (int i = a.size() - 1; i >= 0; --i) {
		c = char((a[i] - '0' + b[i] - '0' + tmp) % 10 + '0') + c;	//第i位的进位
		tmp = (a[i] - '0' + b[i] - '0' + tmp) / 10;					//第i位的值
	}
	if (tmp)				//最高位补位
		c = char(tmp + '0') + c;
	return c;
}

高精度减法

int arr[MAX], brr[MAX], c[MAX];
void substract(string a, string b) {
	int flag = 0;
	if (a.size() < b.size() || a.size() == b.size() && a < b) {
		swap(a, b);
		flag = 1;
	}
	for (int i = a.size(); i > 0; --i)
		arr[i] = a[a.size() - i] - '0';
	for (int i = b.size(); i > 0; --i)
		brr[i] = b[b.size() - i] - '0';
	int c_size = max(a.size(), b.size());
	for (int i = 1; i <= c_size; ++i) {
		if (arr[i] < brr[i]) {
			arr[i + 1]--;
			arr[i] += 10;
		}
		c[i] = arr[i] - brr[i];
	}
	while (!c[c_size]) {
		c_size--;
	}
	if (flag)
		cout << "-";
	for (int i = c_size; i > 0; --i)
		cout << c[i];
	if (c_size < 1)
		cout << 0;
}

大数乘法

#define MAX 1000000
int a[MAX], b[MAX], c[MAX];
void multiply(string A, string B) {
	int flag = 0;
	if (A[0] == '-' && b[0] != '-') {
		flag++;
		A = A.substr(1);
	}
	if (A[0] != '-' && B[0] == '-') {
		flag++;
		B = B.substr(1);
	}
	int LA = A.size(), LB = B.size();
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));
	for (int i = 0; i < LA; ++i) a[i] = A[LA - 1 - i] - '0';
	for (int i = 0; i < LB; ++i) b[i] = B[LA - 1 - i] - '0';
	for (int i = 0; i < LB; ++i)
		for (int j = 0; j < LA; ++j)
			c[i + j] += b[i] * a[j];
	for (int i = 0; i < LA + LB; ++i)
		if (c[i] >= 10) {
			c[i + 1] += c[i] / 10;
			c[i] %= 10;
		}
	int i = LA + LB;
	while (c[i] == 0)
		--i;
	if (flag == 1)
		cout << '-';
	if (i < 0)
		cout << 0;
	else
		for (; i >= 0; --i)
			cout << c[i];
}

分治法求最大值(类比求最小值)

int find_max(int* a, int low, int hight) {
	int max;
	if (low == hight)
		return a[low];
	else {
		int mid = (low + hight) / 2;
		int left_max = find_max(a, low, mid);
		int right_max = find_max(a, mid + 1, hight);
		return max = left_max > right_max ? left_max : right_max;
	}
}

冒泡排序

void Bubble_Sort(int* a, int n) {
	for (int i = n - 1; i > 0; --i) 
		for(int j=0;j<i;++j)
			if (a[j] > a[j + 1]) {
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
}

选择排序(升序)

void Selection_Sort(int *a, int n) {
	for (int i = 0; i < n - 1; ++i) {
		int min_index = i;
		for (int j = i + 1; j < n; ++j) {
			if (a[j] < a[min_index])
				min_index = j;
		}
		int tmp = a[i];
		a[i] = a[min_index];
		a[min_index] = tmp;
	}
}

插入排序

void Insertion_Sort(int *a, int n) {
	for (int i = 1; i < n; ++i) {
		for (int j = 0; j < i; ++j)
			if (a[i] < a[j]) {
				int tmp = a[i];
				for (int k = i; k > j; --k)
					a[k] = a[k - 1];
				a[j] = tmp;
				break;
			}
	}
}

归并排序

//合并
void Merge(int *a, int L,int M,int R) {
	int left_size = M - L,
		right_size = R - M + 1,
		*left = new int[left_size],
		*right = new int[right_size];
	for (int i = L; i < M; ++i)
		left[i - L] = a[i];
	for (int i = M; i <= R; ++i)
		right[i - M] = a[i];
	int i = 0, j = 0, k = L;
	while (i<left_size&&j<right_size)	{
		if (left[i] < right[j])
			a[k++] = left[i++];
		else
			a[k++] = right[j++];
	}
	while (i<left_size)	{
		a[k++] = left[i++];
	}
	while (j<right_size) {
		a[k++] = right[j++];
	}
}
//分治
void Merge_Sort(int* a, int L, int R) {
	if (L == R)
		return;
	int M = (L + R) / 2;
	Merge_Sort(a, L, M);
	Merge_Sort(a, M + 1, R);
	Merge(a, L, M + 1, R);
}

后序中序构建二叉树

Node* buildTree(int* post, int* in, int n) {
	if (n == 0)
		return NULL;
	int* mid = in;
	while (*mid != *(post + n - 1))	mid++;
	Node* T = new Node;
	T->data = *mid;
	int m = mid - in;
	T->lc = buildTree(post, in, m);
	T->rc = buildTree(post + m, mid + 1, n - m - 1);
	return T;
}

前序序中序构建二叉树

Node* buildTree(int* pre, int* in, int n) {
	if (n == 0)
		return 0;
	int* mid = in;
	while (*pre != *mid)mid++;
	Node* T = new Node;
	T->data = *mid;
	int m = mid - in;
	T->lc = buildTree(pre + 1, in, m);
	T->rc = buildTree(pre + 1 + m, mid + 1, n - m - 1);
	return T;
}

汉诺塔问题

//递归
void hanoiTower(int n, char a, char b, char c) {
	if (n == 1)
		cout << a << " -> " << c << endl;
	else {
		hanoiTower(n - 1, a, c, b);
		cout << a << " -> " << b << endl;
		hanoiTower(n - 1, b, a, c);		
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C/C++语言是一种广泛应用于软件开发的编程语言。它具有高效的执行速度、灵活的语法和强大的功能,被广泛用于嵌入式系统、操作系统、游戏开发等领域。 在C/C++语言的面试中,常见的问题包括以下几个方面: 1. 数据类型:C/C++语言中有各种不同的数据类型,如整型、浮点型、字符型、指针等。面试题可能会涉及到不同数据类型的特点、取值范围、大小等方面的问题。 2. 内存管理:C/C++语言需要手动管理内存,因此面试题可能会涉及到堆和栈的区别、内存泄漏的原因及如何避免等方面的问题。 3. 指针和引用:C/C++语言中指针和引用是非常重要的概念,面试题可能会涉及到指针和引用的区别、使用场景、指针数组等方面的问题。 4. 字符串处理:C/C++语言中,字符串是以字符数组的形式存储的,面试题可能会涉及到字符串的输入、输出、比较、拷贝等方面的问题。 5. 文件操作:C/C++语言提供了丰富的文件操作函数,面试题可能会涉及到文件的打开、读写、关闭等方面的问题。 6. 面向对象编程:C++语言支持面向对象编程,面试题可能会涉及到类、对象、继承、多态等方面的问题。 在准备面试时,除了掌握C/C++语言的基础知识外,还可以多做一些相关的编程练习题,提高自己的编程能力和思维灵活性。通过深入理解C/C++语言的特性和原理,做好面试准备,可以增加面试成功的机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值