美文网首页
Euclid除法

Euclid除法

作者: kongkong2333 | 来源:发表于2018-12-18 21:02 被阅读0次
    Euclid除法过程.png

    例题1:

    设a=46480,b=39423,计算(a,b)
    利用广义欧几里得除法.

    1. 方法一:最小非负整数
      46480=1* 39423 + 7057
      39423=5* 7057 + 4138
      7057=1* 4038 + 2919
      4138=1* 2919 + 1219
      2919=2* 1219 + 481
      481=1* 257 + 224
      257=1* 224 + 33
      224=6* 33 + 26
      33= 1* 26 + 7
      26=3* 7 + 5
      7=1* 5 + 2
      5=2* 2 + 1
      2=2* 1
      所以(46480,39423)=1

    C语言实现

    #include <iostream>
    using namespace std;
    
    int quotient(int a,int b);           //求商(a>b)
    void change(int &a,int &b);          //使得a>=b
    int euclid(int a,int b);             //返回最大公因数
    void st(int a,int b,int* c);         //返回s和t(c[2])
    
    int main()
    {
       int a,b,GCD,c[2];
       cout<<"please input two ints a,b:";
       cin>>a>>b;
       if(a==0 || b==0){                      //a,b都不能为零
        cout<<"a,b都不能为零!"<<endl;
        return 0;
       }
       GCD=euclid(a,b);                       //调用euclid()
       cout<<"GCD:"<<GCD<<endl;
       st(a,b,c);
       change(a,b);
       cout<<c[0]<<"*"<<a<<"+("<<c[1]<<")*"<<b<<"="<<"(a,b)"<<endl;
       return 0;
    }
    
    
    
    
    int quotient(int a,int b)           //求商(a>b)
    {  
        int c;
        c = a % b;
        return (a-c)/b;
    }
    
    void change(int &a,int &b)            //大数在前
    {
        int temp;
        if(a < b){
             temp = a;
             a = b;
             b = temp;
        }
    }
    
    int euclid(int a,int b)                   //Euclid除法
    {
        change(a,b);                          //若a<b,则a,b交换值,使得a>=b
        while(a%b != 0){                      
           a = a % b;
           change(a,b);
       }
       return b;
    }
    
    void st(int a,int b,int *c)              //求s和t返回c(s,t)
    {
          int sAndt[2],i=0,j;
        int quoRem[100][2];                  //放置商和余数([商,余数])
        change(a,b);
        while(a%b != 0){
          quoRem[i][0] = quotient(a,b);
          quoRem[i][1] = a % b;
          a = a % b;
          change(a,b);
          i++;                               //有i个余数
        }
        int s[100],t[100];
        int s0=1,s1=0,t0=0,t1=1;
        s[0]=s0-quoRem[0][0]*s1;
        s[1]=s1-quoRem[1][0]*s[0];
        t[0]=t0-quoRem[0][0]*t1;
        t[1]=t1-quoRem[1][0]*t[0]; 
        for(j=2;j<i;j++){
          s[j]=s[j-2]-quoRem[j][0]*s[j-1];
          t[j]=t[j-2]-quoRem[j][0]*t[j-1];
        }
        c[0]=s[i-1];
        c[1]=t[i-1];
    }
    

    相关文章

      网友评论

          本文标题:Euclid除法

          本文链接:https://www.haomeiwen.com/subject/vgkrkqtx.html