周新学(2)

(前)同余定理 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=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;
}
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;
}

猜你喜欢

转载自blog.csdn.net/qq_43731029/article/details/84290175