[读书笔记] 欧几里得算法与该算法的扩充 C#

欧几里得算法 解决的问题是:寻找两个给定的正整数m和n的最大公约数  
下面是C#代码的 欧几里得算法

 

   public   int  MaxDivisor( int  a,  int  b)
        
{
            
int max=a>=b?a:b;//得到最大数
            int min=a<b?a:b;//得到最小数
            int r=1;    //余数
            while (r> 0)
            
{
                r 
= max % min;  //求模
                max = min;
                min 
= r;
            }

            
return max;
        }

 

 

欧几里得算法的扩展,问题描述如下:
寻找两个给定的正整数m和n的最大公约数d 和两个整数,使得a*m+b*n=d 

下面是C#的 欧几里得算法扩展的代码

 

  public   int  MaxDivisorex( int  sum1,  int  sum2,  out   int  a,  out   int  b)
        
{
            
int tmp_b== 0;
            
int tmp_a== 1//tmp_b tmp_a 是 辅助变量
            int max = sum1 >= sum2 ? sum1 : sum2;//得到最大数
            int min = sum1 < sum2 ? sum1 : sum2;//得到最小数
            int q = 0;  //
            int r = 1;    //余数
            q = max / min;
            r 
= max % min;
            max 
= min;
            min 
= r;
            
while (r > 0)
            
{
               
                
int tmp = tmp_a;
                tmp_a 
= a;
                a 
= tmp - q * a;
                tmp 
= tmp_b;
                tmp_b 
= b;
                b 
= tmp - q * b;
                q 
= max / min;
                r 
= max % min;
                max 
= min;
                min 
= r;
            }

            
return max;
        }

结果验证
int  a, b;
            
int  r  =  MaxDivisorex( 1769 551 out  a,  out  b);
            MessageBox .Show(
string .Format ( " {0} * 1769 + {1} *551 = {2} " ,a,b,(a * 1769 + b * 551 )));
这个算法不是很复杂,不过要清楚还真是费事,等我可以解释得很简单的时候我再解释好了,现在相当于我自己的读书笔记。
如果有人能简单的解释出来的话,也麻烦留下言。谢谢。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值