模板代码
最大公约数与最小公倍数
#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必做: