不定方程求特解
来源:互联网 发布:js toggle 编辑:程序博客网 时间:2024/04/29 05:02
形如 ax + by = c,算法思想是采用碾转相除法,由于是整数的关系,核心想法是计算出ax+by = 1,然后x、同时乘上c即其中一个特解。处理ax+by=1,只需要用碾转相除法求出r = 1的情况,然后用r的通项公式带入即可获得x和y的特解
具体详见初等数论。
//算法核心是利用辗转相除法#include<iostream>using namespace std;//求解最小公约数 a>bint gcd(int a, int b){ if (b) { return gcd(b, a%b); } else { return a; }}//a > b且互质void getData(int a, int b, int &x, int& y){ int p0 = 1, p1 = 1, q0 = 0, q1 = 1, n = 0; int q, temp = 0; if (b != 1)//虽然多写了一次这个分支,平均来看,算法会更快 { q = a / b; n++; p1 = q; temp = a % b; a = b; b = temp; while (b != 1)//b代表r,r为1除法结束 { q = a / b; n++; temp = p1 * q + p0; p0 = p1, p1 = temp; temp = q1 * q + q0; q0 = q1, q1 = temp; temp = a % b; a = b; b = temp; } } else//特殊情况,b已经为1,q1为1的标记要退化为0 { q1 = 0; } if (n % 2) { x = q1, y = -p1; } else { x = -q1, y = p1; }}//交换数据void exchange(int &a, int &b){ int temp = a; a = b; b = temp;}int main(){ int x, y; int a, b, c; int flag, flag_a = 1, flag_b = 1; while (cin >> a >> b >> c) { if (a < 0) { flag_a = -1; a = -a; } if (b < 0) { flag_b = -1; b = -b; } flag = a < b; if (flag) { exchange(a, b); } int temp = gcd(a, b); if (c % temp) { return -1; } c /= temp; a /= temp; b /= temp; getData(a, b, x, y); if (flag) { exchange(x, y); } x = x * flag_a * c, y = y * flag_b * c; }}
阅读全文
0 0
- 不定方程求特解
- 不定方程
- 不定方程(什么是不定方程)
- 不定方程(什么是不定方程)
- 二元一次不定方程
- 二元不定方程
- 不定方程总结
- poj1305毕达哥拉斯不定方程
- 二元一次不定方程
- 求解不定方程
- POJ 1061 不定方程
- 解不定方程
- 不定方程的求解
- 解不定方程
- 解不定方程
- fzu1669(毕达哥拉斯不定方程)
- 计算最大公约数和不定方程
- UVALive_6170_Esspe-Peasee(求解不定方程)
- Java Collection toArray方法
- Android应用网络限制功能实现
- exp/imp 与 expdp/impdp 对比 及使用中的一些优化事项
- Android底部弹窗的正确打开方式
- oracle之表的数据类型
- 不定方程求特解
- 算法学习之动态规划--数字三角形最大路径和
- 事务
- SQL语句面试题目:一般查询和高级子查询
- Oracle 分区表 导出导入 迁移
- Android中的Context类解析
- 字符数组和字符指针
- c/c++指针参数如何传递内存
- cisco DHCP