首页 > 编程语言 > 详细

第五周练习I题(扩展欧几里算法)

时间:2015-08-17 19:02:10      阅读:534      评论:0      收藏:0      [点我收藏+]

 

I - 数论,线性方程
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
 

Description

The Sky is Sprite.  The Birds is Fly in the Sky.  The Wind is Wonderful.  Blew Throw the Trees  Trees are Shaking, Leaves are Falling.  Lovers Walk passing, and so are You.  ................................Write in English class by yifenfei 
技术分享

Girls are clever and bright. In HDU every girl like math. Every girl like to solve math problem!  Now tell you two nonnegative integer a and b. Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead. 
 

Input

The input contains multiple test cases.  Each case two nonnegative integer a,b (0<a, b<=2^31) 
 

Output

output nonnegative integer X and integer Y, if there are more answers than the X smaller one will be choosed. If no answer put "sorry" instead. 
 

Sample Input

77 51
10 44
34 79
 

Sample Output

2 -3
sorry
7 -3
 
 
题解:紫书p313
扩展欧几里得算法是 用来在已知a,b 求解一组x,y使得x*a+y*b=gcd(a,b)

 因为已知欧几里得算法gcd(a,b)=gcd(b,a%b)  所以x*a+y*b=gcd(a,b)=gcd(b,a%b)=x*b+y*a%b=x*b+y*(a-a/b*b)=y*a+(x-a/b*y)*b;       

 注意;a-a/b*b=a%b 这样就将a,b的线性组合化简b为a%b与的线性组合. 根据我的输出图可以看到: a,b都在减小,当b减小到0时, 我们就可以得出x=1,y=0; 然后递归回去就可以求出最终的x,y了

 技术分享
#include<iostream>
using namespace std;
void gcd(int a,int b,int & d,int &x,int &y)
{
    if(!b)
    {
            d=a;x=1;y=0;
           // cout<<d<<" "<<x<<" "<<y<<endl;   //输出
    }
    else
    {
        gcd(b,a%b,d,y,x);
       // cout<<b<<" "<<a%b<<" "<<d<<" "<<y<<" "<<x<<endl; //输出
        y-=a/b*x;
       // cout<<x<<" "<<y<<endl;   //输出
    }
}
int main()
{
    int a,b,d,x,y;
    while(cin>>a>>b)
    {
        gcd(a,b,d,x,y);
        if(d!=1) cout<<"sorry"<<endl;
        else
        {
             while(x<0)       //x不能小于0
                x+=b,y-=a;
            cout<<x<<" "<<y<<endl;
        }
    }
    return 0;
}

 

第五周练习I题(扩展欧几里算法)

原文:http://www.cnblogs.com/hfc-xx/p/4737140.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!