周新学(2)

本文深入探讨了快速乘法和快速幂算法,显著提升了运算效率,同时介绍了最大公约数(GCD)的两种求解方法:循环和递归。通过具体实例讲解了尺取法在寻找满足特定条件的子序列问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(前)同余定理 a*(或+)b%c=(a%c)(或+)(b%c)%c
快速乘&&快速幂(大幅减少运行时间与计算步数)时间(logb)
核心代码(快乘)
int fast_pow(int a,int b,int c)
{
int ans=0;
a%=c; //保证初值不超界
while(b)
{
if(b&1) // 相当于b%2
ans=(a+ans)%c;
a=(a+a)%c;
b>>=1; //b/=2
}
return ans%c;
}
核心代码(快幂)
int fast_pow(int a,int b,int c)
{
int ans=1;
a%=c; //保证初值不超界
while(b)
{
if(b&1) // 相当于b%2
ans=a
ans%c;
a=a*a%c;
b>>=1; //b/=2
}
return ans%c;
}
2.
GCD(求最大公约数)
理论
求(a,b)公约数
设a=bq1+r1
b=r1q2+r2
r1=r2q3+r3
r2=r3q4+r4
.
.
.
rn=rn+1qn+2
则求(a,b)最大公约数==求(rn,rn+1)最大公约数
(1)循环
#include<stdio.h>

int gcd(int a,int b)
{
while(b!=0)
{
int t=a;
a=b;
b=t%b;
}
return a;
}

int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)//多组输入
{
int k=gcd(a,b);
printf("%d\n",k); //求最大公约数
}
return 0;
}
(2)递归
#include<stdio.h>
int gcd(int a,int b)
{
if(b==0)
return a’
gcd(b,a%b)
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)//多组输入
{
int k=gcd(a,b);
printf("%d\n",k); //求最大公约数
}
return 0;
}
尺取
举例说明
给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度
输入
n = 10,m = 15

5 1 3 5 10 7 4 9 2 8

输出

2

那么我们先用sum存当前这个子序列的和,从左边第一个数来存,直到这个子序列的和大于等于m为止,再记录下当前长度。

其实相当于当不满足条件就入队,然后得到队列长度,再将队首元素出队,再进行下一次的入队,直到满足条件再次出队,并且将这一次的长度与历史最短长度进行取舍,最后扫到最后的元素却无法再满足入队条件的时候就结束,此时用O(n)的时间就可以得到答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值