程序填空技巧1.0

程序填空要先知道这个程序要干什么,然后找到标准模板后对照模板填写,但当然不是让你做题的时候对照模板写,而是要把每种算法的标准模板背下来,但你肯定要问:邹邹,我哪里来的模板呢???,接下来我会总结最有可能的算法模板:

  1. 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);	//带入公式
}
  1. 质因数分解
    质因数分解是把一个数分解成几个质数的乘积,这叫做质因数分解。
    质因数分解要从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");
}
  1. 二分
    二分也叫折半查找,二分又分为 二分查找二分答案 ,我们要先了解简单的二分查找,二分的查找方法如下:
    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<<" ";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值