从倒水问题到欧几里得算法扩展
2013-09-20 10:21
309 查看
从倒水问题到欧几里得算法扩展
分类: Java数据结构2013-09-1721:38 84人阅读 评论(0) 收藏 举报
Java算法欧几里得算法扩展倒水问题
今天在庞果网做了一道题,倒水问题,题目如下,有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: 把一个容器灌满; 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。问是否能够通过有限次操作,使得水缸最后恰好有C升水。
X*A+Y*B=C
根据欧几里得算法的扩展定理
定理
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整
数对 x,y ,使得 gcd(a,b)=ax+by,
并且是能表示的最小正元素;
ax+by = gcd(a,b)+(cx+dy);a = e*gcd(a,b),b=f*g(a,b);
所以ax+by能组合的数一定是gcd(a,b) 的自然数倍;
那么只要C是gcd(a,b)的倍数就返回true,反之返回false。
java实现如下
[java] view
plaincopyprint?
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
public static boolean can(int a,int b,int c) {
int res;
res=mod(a,b);
if(c%res==0)
return true;
else
return false;
}
public static void main(String args[])
{
System.out.print(can(0,1,1000000000));
}
public static int mod(int a,int b){
if(b>=1){
return mod(b, a%b);
}
else return a;
}
}
相关文章推荐
- 从倒水问题到欧几里得算法扩展
- 用欧几里得算法解决倒水问题
- 庞果网在线编程---倒水---扩展欧几里得算法
- [ffmpeg 扩展第三方库编译系列] frei0r mingw32 下编译问题
- 数论——(扩展)欧几里得算法辨析
- [算法][庞果网]倒水问题/量水问题
- 例题7-8 倒水问题(Fill, UVa 10603)
- php扩展安装Api Version不匹配问题
- 扩展欧几里得算法是干什么用的?
- Python扩展问题”unable to find vcvarsall.bat“的解决
- 《编程之美》3.11 扩展问题
- 请使劲回答一个关于UNIX/Linux自动扩展stack的问题
- 趣题:经典二分问题的一个扩展
- 求二进制中1 的个数 及扩展问题
- ORA-01653:表空间扩展失败的问题
- Java多线程间的通信问题扩展
- 关于php扩展编程如何返回数组的问题
- POJ 3414 Pots(BFS倒水问题)
- 解决phpmyadmin中缺少mysqli扩展问题的方法
- 由于扩展配置问题而无法提供您请求的页面错误解决方法