模板代码

模板代码

最大公约数与最小公倍数

#include<iostream>
using namespace std;
//求最大公约数
int gcd(int a,int b)
{
	int tmp;
	if(b)
		tmp = a%b;
	else
		return a;
	while(tmp)
	{
		a = b;
		b = tmp;
		tmp = a%b;
	}
	return b;	
 } 
//求最小公倍数
int lcm(int a,int b)
{
	return g/gcd(a,b)*b;
}

int main()
{
	int a,b;
	cin>>a>>b;
	cout<<gcd(a,b)<<endl;
	return 0;
}

大写字母转小写字母

#include<iostream>
using namespace std;

int main()
{
	char s[128] = {0};
	getline(s,128);
	for(int i=0;i<strlen(s);i++)
	{
		if(s[i]>=65 && s[i]<=90)
		{
			if(s[i]==90)
				s[i] = 65;
			s[i] ^= ' '; //与空格做异或运算,大写转小写,小写转大写
		}
	}
	cout<<s<<endl;
	return 0;
}

从1~n的数字全排列个数

#include<iostream>
using namespace std;

int n;
bool visit[15];
int res[15];
bool flag; 
long long ret=0;
void dfs(int x)
{
	//完整的一次搜索结束的条件,比如n=4,  1 2 3 4就是一次完整的搜索 
	if(x>n)
	{
		flag = 1;
		for(int i=1;i<=n;i++)
		{
			if(res[i]+i >n+2)
			{
				flag=0;
				break;
			}				
		} 
		
		if(flag)
		{
			for(int i=1;i<=n;i++)
			{
				cout<< res[i]<<" ";
			} 
			cout<<endl;
			ret++;
		}

		return;
	}
	//dfs模板
	for(int i=1;i<=n;i++)
	{
		if(!visit[i])
		{
			res[x] = i;
			visit[i] = true;
			dfs(x+1);
			visit[i] = false;
		}
	}
}

int main()
{
	cin>>n;
	dfs(1);
	cout<<ret;
	return 0;
}

十进制转二进制,并计算二进制中有多少个1

#include<iostream>
using namespace std;

int a[33],cnt;
int main()
{
	int n,sum,x;
	cin>>n;
	cnt=0;
	x = n;
	//短除法求二进制,a数组中存储n的二进制
	while(x>0)
	{
		a[++cnt] = x%2;
		x/=2;
	}
	//算a数组中有多少个1
	sum=0;
	for(int i=1; i<=cnt ;i++)
	{
		if(a[i]==1)
			sum++;
	}
	cout<<sum<<endl;
	return 0;
}
#include<iostream>
using namespace std;

char s1[1005],s2[1005];
int a[1005],b[1005],c[1005];
int main()
{
	int la,lb,lc;
	cin>>s1;
	cin>>s2;
	la = strlen(s1);
	lb = strlen(s2);
	lc = max(la,lb)+1;
	for(int i=0;i<la;i++)
		a[la-i] = s1[i] - '0';
	for(int i=0;i<lb;i++)
		b[lb-i] = s2[i] - '0';
	for(int i=0;i<lc;i++){
		c[i] += a[i] + b[i];
		c[i+1] = c[i]/10;
		c[i] = c[i] % 10;
	}
	if(c[lc]==0 && lc>0)
		lc--;
	for(int i=lc;i>0;i--)
	{
		cout<<c[i];
	}
	return 0;
}
#include<iostream>
using namespace std;

int t,a[100],x[100];
void dfs(int d,int i,int n)
{
	if(n==1)
	{
		for(int k=0;k<d;k++)
		{
			cout<<a[k];
		 } 
		 cout<<endl;
	} 
	else{
		for(int k=i;k<t;k++)
		{
			if(n%x[k]==0)
			{
				a[d] = x[k];
				dfs(d+1,k,n/x[k])
			}
		}
	}
}
int main()
{
	int n;
	cin>>n;
	for(int i=n;i>1;i--)
	{
		if(n%i==0)
			x[t++] = i;
	}
	dfs(0,0,n);
	return 0;
}
#include <iostream>
using namespace std;

void printPrimeFactors(int n, int divisor = 2) {
    // 基本情况:如果n为1,则停止递归
    if (n == 1) {
        return;
    }
    
    // 如果divisor是n的因数,则打印divisor,并递归分解n/divisor
    if (n % divisor == 0) {
        cout << divisor << " ";
        printPrimeFactors(n / divisor, divisor);
    } else {
        // 如果divisor不是因数,则尝试下一个数
        printPrimeFactors(n, divisor + 1);
    }
}

int main() {
    int number;
    cout << "Enter a number to factorize: ";
    cin >> number;
    cout << "Prime factors of " << number << " are: ";
    printPrimeFactors(number);
    cout << endl;
    return 0;
}

#include<iostream>
using namespace std;

int n, point[100]; // point数组存储每个点的下一个点
bool vis[100]; // vis数组用于标记节点是否被访问过

int main() {
    int cnt = 0; // cnt用于计数环的数量
    cin >> n; // 读取节点数量
    for(int i = 0; i < n; i++) {
        cin >> point[i]; // 读取每个点的下一个点
        point[i]--; // 由于输入的可能是1到n的编号,将其转换为0到n-1的编号
        vis[i] = false; // 初始化vis数组
    }
    
    for(int i = 0; i < n; i++) {
        if(!vis[i]) { // 如果节点i没有被访问过
            int j = i;
            while(!vis[j]) { // 遍历环
                vis[j] = true; // 标记节点j为已访问
                j = point[j]; // 移动到下一个点
            }
            cnt++; // 发现一个环,计数增加
        }
    }
    
    cout << cnt; // 输出环的总数
    return 0;
}

#include<iostream>
using namespace std;

char change(char str)
{
	if(str>='a' && str<='z')
	{
		str -= 32;
		return str;
	}
}
int main()
{
	string s1,s2;
	cin>>s1>>s2;
	int cnt=0;
	for(int i=0;i<s1.size();i++)
	{
		for(int j=0;j<s2.size();j++)
		{
			if(change(s1[i])==change(s2[j]))
				cnt++;
		}
	}
	cout<<cnt;
	return 0;
}
#include<iostream>
using namespace std;

int solve(int n,int m)
{
	int i,sum;
	if(m==1)
	{
		return 1;
	}
	sum = 0;
	for(i=1;i<n;i++)
	{
		sum += solve(i,m-1); 
	}
	return sum;
}

int main()
{
	int n,m;
	cin>>n>>m;
	cout<<solve(n,m)<<endl;
	return 0;
}
#include <iostream> 
using namespace std; 
 
int main() 
{ 
	 unsigned short x, y;
	 cin >> x >> y;
	 x = (x | x << 2) & 0x33; 
	 x = (x | x << 1) & 0x55; 
	 y = (y | y << 2) & 0x33; 
	 y = (y | y << 1) & 0x55; 
	 unsigned short z = x | y << 1; 
	 cout << z << endl;
	 return 0;
 }

埃氏筛法判定素数

#include<iostream>
using namespace std;

int primes[10000],cnt;
bool v[10000];
void get_primes(int n)
{
	for(int i=2;i<=n;i++)
	{
		if(v[i])
			continue;
		primes[cnt++] = i;
		for(int j=i+i;j<=n;j+=i) //对于每个质数i,标记所有i的倍数为合数
		{
			v[j] = true;	 // 将j标记为合数
		}	
	}	
} 

int main()
{
	int n=280;
	get_primes(n);	
	for(int i=0;i<cnt;i++)
		cout<<primes[i]<<endl;
}

试除法分解质因数

#include<iostream>
using namespace std;

void divide(int x)
{
	for(int i=2;i*i<=x;i++)
	{
		while(x % i==0)
		{
			x/=i;
			cout<<i<<" ";
		}
	}
	if(x>1)
		cout<<x<<endl; 
}

int main()
{
	int n=399;
	divide(n);
}

线性筛法求质数

#include<iostream>
using namespace std;

int primes[10000],cnt;
bool v[10000];
void get_primes(int n)
{
	for(int i=2;i<=n;i++)
	{
		if(!v[i])
			primes[cnt++] = i;
		// 对于每个质数primes[j],检查i*primes[j]是否小于或等于n。
		for(int j=0;i*primes[j]<=n;j++) 
		{
			v[primes[j] * i] = true; //将primes[j] * i标记为合数。
			if(i % primes[j]==0) // 如果i能被primes[j]整除,则跳出循环。
				break;	 //这一行是为了确保在标记i*primes[j]为合数之前,我们已经知道i不是质数,从而避免了重复标记。
		}	
	}	
} 

int main()
{
	int n=280;
	get_primes(n);	
	for(int i=0;i<cnt;i++)
		cout<<primes[i]<<endl;
}

CSP必做:

  • P3912 素数个数
posted @ 2024-07-31 22:25  梁君牧  阅读(7)  评论(0编辑  收藏  举报