1. 程式人生 > >周新學(2)

周新學(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;
}