目录
最大公约数模板
//最大公约数,欧几里得算法又叫辗转相除法
int gcd(long a,long b)
{
return b==0?a:gcd(b,a%b);
}
最小公倍数模板
int lcm(int a,int b)
{
int ans;
b==0?a:gcd(b,a%b);
return ans=a/gcd(a,b)*b;
}
快速幂(递归)模板
typedef long long LL;
LL pow(LL a,LL b)
{if(b==0) return 1;
if(b&1) return a*pow(a,b-1);
else{LL mul=pow(a,b/2);
return mul*mul;}
快速幂(迭代)模板
typedef long long LL;
LL pow(LL a,LL b)
{
LL ans=1;
while(b>0)
{
if(b&1)
ans=ans*a;
a=a*a;
b>>=1;
}//二进制右移1位,表示b=b/2
return ans;
}
斐波那契(递归)-最慢
int fib(int n)
{
if (n<1) return 0;
if(n==1||n==2) return 1;
return fib(n-1)+fib(n-2);
}
判断是否为闰平年
普通年能被4整除且不能被100整除为闰年
世纪年能被400整除为闰年
bool is_LeapYear()
{
if(a%400==0||a%4==0&&a%100!=0)
{
cout<<闰年366天<<endl;
return true;
}
else
{
cout<<平年365天<<endl;
return false;
}
}
判断素数(又叫质数)
bool isPrime(int n)
{
if(n<=1) return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++)
{
if(n%i==0) return false;
}
return true;
}
判断素数(线性筛)
int p[N],cnt;
bool vis[N];
void get_prime(int x)
{
vis[1]=true;
for(int i=2;i<=x;i++)
{
if(!vis[i]) p[cnt++]=i;
for(int j=0;p[j]<=x/i;j++)
{
vis[p[j]*i]=1;
if(i%p[j]==0) break;
}
}
}
遍历个位,十位,百位。。
int f(int x)
{
int t=x%10;
x/=10;
}
组合数的计算(递归)
long long res[67][67]={0};
long long C(long long n,long long m)
{
if(m==0||m==n) return 1;
if(res[n][m]!=0) return res[n][m];
return res[n][m]=C(n-1,m)+C(n-1,m-1);
}//n=67,m=33时溢出
组合数的计算(定义式变形)
long long C(long long n,long long m)
{
long long ans=1;
for(long long i=1;i<=m;i++)
{
ans=ans*(n-m+i)/i;}
return ans;
}//n=62,m=31时溢出
}
(进制转换)将P进制x转换为十进制的数y
int y=0,n=1;//n在循环中会不断乘P,得到1、P、P的平方、P的三次。。。
while(x!=0)
{
y+=(x%10)*n;
x/=10;
n*=P;
}
(进制转换)将十进制数y转换为Q进制数z
int z[40],num=0;//数组z存放Q进制y的每一位,num为位数
do{
z[num++]=y%Q;
y=y/Q;
}
while(y!=0);
//最后将z数组从高位【num-1】到【0】就是Q进制数z
回文串(整数)
bool isPalindrome(int x)
{
int temp=x,sum;
if(x<0) return false;
while(x)
{
sum=sum*10+x%10;
x/=10;
}
if(temp==sum) return true;
else return false;
}
回文串(字符串)
int flag=0; char a[100];
gets(a);
int len=strlen(a);
for(int i=0;i<len/2;i++)
{
if(a[i]!=a[len-1-i])
{
flag=true;
break;
}
}
if(!flag) printf("是回文串!");
else printf("不是回文串");
蔡基姆拉尔森计算公式
//y为年份,m为月份,d为日期
w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1
//每年的1,2月要当成上一年的13,14月去算
//例如,1901年1月1日应该当成1900年13月1日