欧几里得算法和扩展欧几里得算法的简单例子
欧几里得算法:
#include <cstdio>
#include <cstdlib>/*
* 挑战。。。p113
*/struct point{ //格点int x;int y;
};point p1, p2; //两个格点int gcd(int a,int b){ //欧几里得算法if(b == 0) {return a;} else {return gcd(b, a % b);}
}void solve(){int px = abs(p1.x - p2.x); //两格点的x坐标距离int py = abs(p1.y - p2.y); //两格点的y左边距离int res = 0;if(px != 0 && py != 0){res = gcd(px, py) - 1;}printf("%d\n", res);
}int main(){while(scanf("%d%d%d%d", &p1.x, &p1.y, &p2.x, &p2.y) != EOF){solve();}return 0;
}
扩展欧几里得算法:
#include <cstdio>/*
* 挑战程序设计竞赛 p115
/*//思路:
//扩展欧几里得算法是在欧几里得的算法基础上求解模线性方程及方程组
//已知ax + by = 1,gcd(a, b) = 1
//所以ax + by = gcd(a, b) ①
//再辗转相除一次后,①变为②
//bx + (a % b)y = gcd(a, b) ②
//a % b = a - (a / b) * b ③
//将③代入②得到④
//bx + (a - (a / b) * b)y = gcd(a, b) ④
//将④化简为⑤
//ay + b(x - (a / b) * y) = gcd(a, b) ⑤//当b = 0时,显然有 a = gcd(a , b),这时 x = 1, y = 0
//总之,有如下几个等式
// 当 b = 0 时,x = 1, y = 0
// 其他情况 x = y, y = (x - (a / b) * y)int a,b;
int x,y;
int extgcd(int a, int b, int &x, int &y){ //扩展欧几里得算法if(b == 0){x = 1;y = 0;return a;} else {int r = extgcd(b, a % b, x, y);int t = x;x = y;y = t - (a / b) * y;return r;}
}void solve(){int res = extgcd(a, b, x, y);if(res != 1){printf("-1\n");return;}if(x > 0){printf("%d0", x);} else {printf("0%d", -x);}if(y > 0){printf("%d0\n", y);} else {printf("0%d\n", -y);}
}int main(){while(scanf("%d%d", &a, &b) != EOF){solve();}
}
欧几里得算法和扩展欧几里得算法的简单例子相关推荐
- 欧几里得算法和扩展欧几里得算法——杨子曰数学
欧几里得算法和扩展欧几里得算法--杨子曰数学 超链接:数学合集 不说废话,咱们直接开始 欧几里得算法 一句话: g c d ( a , b ) = g c d ( b , a m o d b ) gc ...
- 密码学基础算法(一)基于整数的欧几里得算法和扩展欧几里得算法
图片来源: 随便谷歌的一个图片 图片地址: https://jason-chen-1992.weebly.com/uploads/1/0/8/5/108557741/euclidean_3_orig. ...
- 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)
一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...
- 欧几里得算法和扩展欧几里得算法详解
欧几里得算法: int gcd(int x,int y){if(y) return gcd(y,x%y);return x; } 扩展欧几里得算法: 先说一个整体思路: 先求Ax+By=gcd(A,B ...
- 欧几里得算法和扩展欧几里得
主要是为了密码学整理的.(这排版真是..我真的不知道怎么弄,谁能帮帮我) 欧几里得算法 欧几里得算法或者叫做辗转相除法,是指用于计算两个正整数a,b的最大公约数. gcd(a,b)=gcd(b,amo ...
- 欧几里得算法和拓展欧几里得算法
一.欧几里得算法(辗转相除法): 结论:gcd(a,b)=gcd(b,a%b). 证明:假设a,b的最大公约数为r,a=k1r,b=k2r(k1>k2). 则a%b=k1r-nk2r=(k1-n ...
- c语言选择法排序案例,谁能给我一个c语言选择排序法的简单例子
满意答案 evil8375 2014.02.27 采纳率:51% 等级:11 已帮助:7590人 #include int main() { int array[100], n, c, d, p ...
- C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法
前言 在关于数论的学习中,求解二元一次不定方程是很重要的,在学习求解二元一次不定方程之前,要先了解欧几里得算法和扩展欧几里得算法. 关于数论的学习 欧几里得算法 欧几里得算法就是辗转相除法,欧几里得算 ...
- 欧几里得算法及扩展欧几里得算法简单解释
欧几里得算法: 解释:给定两个自然数,求出两个自然数的最大公约数.也叫--辗转相除法 过程:1.给定两个自然数a.b 2.a == 0 时 gcd(a,b)= b:b == 0 时 gcd(a,b) ...
最新文章
- 服务器技术综述(四)
- 学生的新增mySQL文档_MySQL增删改查
- nginx配置laravel
- AIX上报:“Shell will time out in 60 seconds” 解决办法
- hp服务器raid一直显示同步,HP Netserver NetRAID 一致性检查常见问题解答(FAQ)
- 应用神经网络相关pre-processing(预处理 )
- 光流在视频检测和分割的再应用
- 浏览器趋势2016年9月:浏览器大战结束了吗?
- 关于 U盘被写保护的问题
- vue typeScript get set 用法
- 如何使用浏览器的网页全文翻译工具
- 科普:一片晶圆可以切多少个芯片?
- arm板linux内核移植,ARM开发板上uClinux内核移植
- centos7.6安装mysql数据库_CentOS7.6安装MYSQL8.0
- SaaS ToB产品的易用性设计2
- Lipschitz常数、Lipschitz条件
- 白盒测试中的逻辑覆盖法
- Codeforces Round #824 (Div. 2) C. Phase Shift
- 隆重推荐:大明王朝1566
- 钉钉发送消息(非群机器人)