模板总结

49 阅读1分钟

进制转换

  1. 将p进制数x转换为十进制数y
        int x=121,q=8;
        int y=0,product=1;
	while(x!=0){
		y=y+(x%10)*product;
		x/=10;
		product*=p;
	}
  1. 将十进制数y转换为q进制数z
        int y=81,q=8;
	int z[40],num=0;
	do{
		z[num++]=y%q;//除基取余 
		y=y/q;
	}while(y!=0);
	for(int i=num-1;i>=0;i--){
		cout<<z[i];
	}

使用do···while语句而不是while的原因是如果十进制数y恰好等于0,那么while语句将使循环退出,导致结果出错,正确结果应该是数组z中存储了z[0]=0

回文数

// 枚举五位数
    for (int i = 10000; i <= 99999; i++) {
        int sum = 0, t = i;
        while (t) {
            sum += t % 10;   // 取出个位数字并累加
            t /= 10;         // 去掉个位数字
        }
        if (sum == n) {
            // 判断是否为回文数
            int a = i / 10000, b = i % 10, c = i / 1000 % 10, d = i / 10 % 10;
            if (a == b && c == d )
                cout << i << endl;
        }
    }

判断闰年

#include <iostream>
using namespace std;

int main() {
    int y;
    cin>>y;
    if(y%400==0 || y%4==0 && y%100 !=0)
    	cout<<"yes";
    	else cout<<"no";
    return 0;
}

杨辉三角

#include <iostream>
using namespace std;

int main() {
   int numRows;
   cin>>numRows;
   int triangle[numRows][numRows]; // 创建一个二维数组来存储三角形中的数字
   // 填充三角形数组
   for (int i = 0; i < numRows; i++) {
      for (int j = 0; j <= i; j++) {
         if (j == 0 || j == i) {
            triangle[i][j] = 1;
         } else {
            triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
         }
      }
   }
   // 输出结果
   for (int i = 0; i < numRows; i++) {
      for (int j = 0; j <= i; j++) {
         cout << triangle[i][j] << " ";
      }
      cout << endl;
   }
   return 0;
}

并查集

//查找
int findFather(int x)
{
	int a=x;
	while(x!=father[x]){
		x=father[x];
	}
	//路径压缩
	while(a!=father[a]){
		int z=a;
		a=father[a];
		father[z]=x;
	}
	return x;
}
//合并
void Union(int a,int b)
{
	int faA=findFather(a);
	int faB=findFather(b);
	if(faA!=faB){
		father[faA]=faB;
	}
}

例题 image.png 样例输入

7 5
1 2
2 3
3 1
1 4
5 6

样例输出

3

Code

#include<bits/stdc++.h> 
using namespace std;
const int N=110;
int father[N];
bool isRoot[N];
int findFather(int x)
{
	int a=x;
	while(x!=father[x]){
		x=father[x];
	}
	//路径压缩
	while(a!=father[a]){
		int z=a;
		a=father[a];
		father[z]=x;
	}
	return x;
}
void Union(int a,int b)
{
	int faA=findFather(a);
	int faB=findFather(b);
	if(faA!=faB){
		father[faA]=faB;
	}
}
void init(int n)
{
	for(int i=1;i<=n;i++){
		father[i]=i;
		isRoot[i]=false;
	}
}
int main()
{
	int n,m,a,b;
	cin>>n>>m;
	init(n);
	for(int i=0;i<m;i++){
		cin>>a>>b;
		Union(a,b);
	}
	for(int i=1;i<=n;i++){
		isRoot[findFather(i)]=true;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		ans+=isRoot[i];
	}
	cout<<ans;
	return 0;
}

注意 如果需要统计集合内元素个数,则将isRoot数组改为int型

二分查找

//二分查找 [left,right] 传入初始值[0,n-1] 查找失败返回-1 
int binarySearch(int A[], int left ,int right, int x)
{
    int mid;
    while(left<=right){
        mid=left+(right-left)/2;
        if(A[mid]==x) return mid;
        else if(A[mid]>x){
            right=mid-1;
        }else{
            left=mid+1;
        }
    }
    return -1;
}

//返回第一个大于等于x的位置 传入初始值[0,n]
int lower_bound(int A[], int left ,int right, int x)
{
    int mid;
    while(left<right){
        mid=left+(right-left)/2;
        if(A[mid]>=x){
            right=mid;
        }else{
            left=mid+1;
        }
    }
    return left;
}

//返回第一个大于x的位置 传入初始值[0,n]
int upper_bound(int A[], int left ,int right, int x)
{
    int mid;
    while(left<right){
        mid=left+(right-left)/2;
        if(A[mid]>x){
            right=mid;
        }else{
            left=mid+1;
        }
    }
    return left;
}

初始化

#include<bits/stdc++.h>
using namespace std;
const int maxn=10;
int main() {
	int num[maxn];
        //赋初值0 memset比较快,但是最好只用来赋初值为0
	memset(num,'\0',sizeof(num));
	for(int i=0;i<maxn;i++){
		cout<<num[i]<<" "; 
	}
	cout<<endl;
        //赋初值 任意赋值
	fill(num,num+maxn,2);
	for(int i=0;i<maxn;i++){
		cout<<num[i]<<" "; 
	}
	return 0;
}