欧几里得扩展算法
来源:互联网 发布:长城三公主知乎 编辑:程序博客网 时间:2024/05/01 08:35
更详细的解释,这个博主的文章在这:http://m.blog.csdn.net/article/details?id=8271123。
大概原理就是,找到一份满足a,b的最小公约数的解 即ax+by=gcd(a,b),然后在根据需要把
c的值进行放大与缩小
(a*c)x+(b*c)y=gcd(a,b)*c gcd(a,b)*c即需要求得的值。
一份gcd求得的x,y最小值c++代码:
#include<bits/stdc++.h> using namespace std;int x,y; int gcd(int a,int b)//一个函数,返回gcd(a,b){ if(b==0) { x=1;y=0;//边界时候的赋值 return a; } else{ int ans=gcd(b,a%b); int t=x;x=y;//这一句和后一句就是刚才推到的求法 y=t-a/b*y; return ans; }}int main(int argc, char const *argv[]){ int a,b; scanf("%d%d",&a,&b); int ans=gcd(a,b); printf("%d\n",ans); printf("%d %d",x,y); return 0;}```一份优化处理之后,求x是正整数的代码: ``` #include<bits/stdc++.h> #include<iostream>using namespace std;int kzgcd(int a,int b,int &x,int &y){ if(b==0){ x=1,y=0; return a; } int res = kzgcd(b,a%b,y,x); y -= a/b*x; return res;}int main(){ int n,m; while(cin>>n>>m){ int x,y; int flag=kzgcd(n,m,x,y); if(flag!=1) { printf("sorry\n"); continue; } while(x<0){ //// 对解的要求 a(x+b)+b(x-a)=c x += m; //// 注意解的转化 y -= n; //// } printf("%d %d\n",x,y); }}
0 0
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得算法/扩展欧几里得算法
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得、扩展的欧几里得算法
- 欧几里得及欧几里得扩展算法
- 欧几里得、扩展的欧几里得算法 .
- 欧几里得与扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得算法及扩展欧几里得
- 欧几里得和扩展欧几里得算法
- 欧几里得, 扩展欧几里得算法模板
- 欧几里得算法及其扩展
- 扩展的欧几里得算法
- 扩展的欧几里得算法
- 欧几里得扩展算法
- 扩展欧几里得算法
- 扩展欧几里得算法
- Git for windows 中文乱码解决方案
- dll中创建对话框一闪而过
- wing带你玩转自定义view系列(1) 仿360内存清理效果
- jQuery post json数据 服务端异常
- Java final关键字声明的意义
- 欧几里得扩展算法
- 说说常用的服务器操作
- HP-UX+11.2.0.3RAC因裸设备权限不一致导致RAC一个节点报错的解决
- css3线性渐变
- hdu 2079 选课时间 DP动态规划 母函数 穷举 寒假集训1 07
- 服务端开发小感
- mysql ERROR 1045 (28000): Access denied for user解决方法
- 数据存储
- 网络舆情分析师