美文网首页
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除法

    例题1: 设a=46480,b=39423,计算(a,b)利用广义欧几里得除法. 方法一:最小非负整数46480=...

  • Euclid GCD算法原理

    [转载于] https://thiscute.world/posts/mathematics-in-euclide...

  • Python学习笔记(二)几种除法的比较

    传统除法(' /')、真除法、floor除法(' // ') ·传统除法和真除法:在Python2.7之前,对整数...

  • python tricks

    除法 精确除法

  • Python里的除法

    python里有三种除法: 传统除法如果是整数除法,执行地板除。如果是浮点数除法,则执行精确除法。 地板除用 //...

  • Book Review: Euclid’s Elements

    作者:Euclid出版社:Richard Fitzpatrick发行时间:2008来源:下载的 PDF 版本Goo...

  • 欧几里得算法【Euclid Algorithm】

    引言 欧几里得算法用于求两整数的最大公约数,是一个简单却经典的算法,很多算法或者数论领域的入门书都将它作为引子。 ...

  • 算法-辗转相除法

    算法:辗转相除法(欧几里得算法) GCD递归定理 辗转相除法算法概述 辗转相除法伪代码 辗转相除法代码实现 对于两...

  • 小数除法

    大家对除法一定很熟悉吧,可是你们听说过“小数除法”吗? 在我看来小数除法只不过是除法的一个难度增加,所以小数除法和...

  • 除法思维。

    除法思维,是将成分拆分在重组的创新思维。主要考虑形式而不是功能。 可分为物理除法,保留除法,功能性除法。不过各自的...

网友评论

      本文标题:Euclid除法

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