程序填空要先知道这个程序要干什么,然后找到标准模板后对照模板填写,但当然不是让你做题的时候对照模板写,而是要把每种算法的标准模板背下来,但你肯定要问:邹邹,我哪里来的模板呢???,接下来我会总结最有可能的算法模板:
- gcd和lcm问题:
gcd是最大公约数的英文缩写,lcm是最小公倍数的英文缩写,我们先来看gcd的标准模板:
首先我们要了解怎么做gcd,我们要用一种叫辗转相除法,就是每次把b的值赋给a,把a%b的值赋给b,如果b的值是0,说明已经找到了,就是a的值
这里就是每次判断如果b的值是0的话就输出a的值并跳出
基础代码如下:
int gcd(int a,int b)
{
int r=a%b;
while(r!=0) //判断r的值是否为0(判断是不是最大公约数)
{
a=b;
b=r;
r=a%b;
}
return b;
}
如果能力再强一点可以写递归进阶版:
int gcd(int a,int b)
{
if(b==0) //如果找到了就往回递归
{
return a;
}
return gcd(b,a%b); //gcd递归写法更简单
}
接下来是lcm的标准模板:
我们先要知道gcd的公式,然后才可以推出lcm的结果,lcm的公式为:
l
c
m
=
a
×
b
÷
g
c
d
(
a
,
b
)
lcm=a×b÷gcd(a,b)
lcm=a×b÷gcd(a,b)
所以标准模板为:
int gcd(int a,int b) //gcd和前面一样
{
if(b==0)
{
return a;
}
return gcd(b,a%b);
}
int lcm(int a,int b)
{
return a*b/gcd(a,b); //带入公式
}
- 质因数分解
质因数分解是把一个数分解成几个质数的乘积,这叫做质因数分解。
质因数分解要从2开始,因为最小的质数就是2,也不用判断质数,因为学过埃氏筛和欧拉筛的都知道,2算完了之后,4,6,8像这些2的倍数其实都被筛掉了(指不能用这些数乘出这个数了),但是有的数很大(指一次一次遍历的复杂度高),所以我们要用 n \sqrt n n,这样复杂度就是 O ( n ) O(\sqrt n) O(n),复杂度很低。
标准模板:
for(int i=2;i*i<=n;i++) //这里sqrt(n)也可以,这样复杂度低
{
while(n%i==0) //找到n的倍数
{
printf("%d ",i);
n/=i;
}
}
if(n>1) //如果找不到就输出no
{
printf("no");
}
- 二分
二分也叫折半查找,二分又分为 二分查找 和 二分答案 ,我们要先了解简单的二分查找,二分的查找方法如下:
100→50→25→…→1
100里一共最多要找7次
二分的查找方法就是每次砍半后看是否大于要找的数,所以标准模板如下:
while(m--){
scanf("%d",&q);
int l=1,r=n;
while(r-l>3){ // 当[l,r]长度大于4的时候
int mid=(l+r)/2;
if(a[mid]<q) l=mid;
else r=mid;
// cout<<l<<" "<<r<<endl;
}
bool flag=0;
for(int i=l;i<=r;i++){
if(a[i]==q){
flag=1;
cout<<i<<" ";
break;
}
}
if(flag==0) cout<<-1<<" ";
}