第二次作业
#include<iostream>
using namespace std;
int gcd(int a,int b)//迭代法实现gcd
{
while(a%b)
{
int k;
if(a%b!=0)
{
k=b;
b=a%b;
a=k;
}
}
return b;
}
int main()
{
int a,b;
cin>>a>>b;
cout<<"gcd(a,b)="<<gcd(a,b)<<endl;
return 0;
}
二进制gcd:
#include<iostream>
using namespace std;
int gcd(int a,int b)//二进制gcd
{
int i,j;
if(a==0)
{
return b;
}
if(b==0)
{
return a;
}
for(i=0;0==(a&1);++i)
{
a>>=1;
}
for(j=0;0==(b&1);++j)
{
b>>=1;
}
if(i>j)
i=j;
while(1)
{
if(a<b)
{
a^=b;
b^=a;
a^=b;
}
if(0==(a-=b))
return b<<i;
while(0==(a&1))
a >>= 1;
}
}
int main()
{
int a,b;
cin>>a>>b;
cout<<"gcd(a,b)="<<gcd(a,b)<<endl;
return 0;
}
egcd
#include<iostream>
using namespace std;
int *egcd(int a, int b,int r0 =1,int s0 =0,int r1= 0,int s1 = 1)//egcd
{
int *result=new int[3];
result[0]=a;
result[1]=r0;
result[2]=s0;
if(b==0)
return result;
int q=a/b;
return egcd(b,a%b,r1,s1,r0-q*r1,s0-q*s1);
}
int _tmain(int argc, _TCHAR* argv[])
{
int a,b;
cin>>a>>b;
int *result=egcd(a,b);
cout<<result[0]<<endl;
return 0;
}
begcd
#include<stdio.h>
#include<stdlib.h>
void swap(int* a,int* b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
int* begcd(int a,int b)
{
int r=a;
int _r=b;
int k=0;
while(!(r&1)&&!(_r&1))
{
r>>=1;
_r>>=1;
k++;
}
int _a=r;
int _b=_r;
int x=1;
int y=0;
int _x=0;
int _y=1;
while(_r){
while(!(r&1))
{
r>>=1;
if(!(x&1)&&!(y&1))
{
x>>=1;y>>=1;
}
else
{
x=(x+_b)>>1;
y=(y-_a)>>1;
}
}
while(!(_r&1))
{
_r>>=1;
if((_x&_y)&1)
{
_x>>=1;_y>>=1;
}
else
{
_x=(_x+_b)>>1;
_y=(_y-_a)>>1;
}
}
if(_r<r)
{
swap(&r,&_r);
swap(&x,&_x);
swap(&y,&_y);
}
_r-=r;_x-=x;_y-=y;
}
int *res=(int*)malloc(sizeof(int)*3);
res[0]=x;res[1]=y;res[2]=(r<<k);
return res;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
int *tmp=begcd(a,b);
printf("%d*%d+%d*%d=%d\n",a,tmp[0],b,tmp[1],tmp[2]);
free(tmp);
return 0;
}