在博客园上看到一个小牛发啦一个剩余算法的分析:
一个婚宴,安排来客,5个人一桌剩余4人,7个人一桌剩6桌,9个人一桌剩余8人,11个人一桌正好,当时看到那个哥们又是剩余算法又是加密算法的,最后抽象出一个算法,如下:
import junit.framework.TestCase;
public class ShareTest1 extends TestCase {
/** *//**
* Return the greatest common divisor.
*/
public static long gcd( long a, long b )
{
if( b == 0 )
return a;
else
return gcd( b, a % b );
}
// Internal variables for fullGcd
private static long x;
private static long y;
/** *//**
* Works back through Euclid's algorithm to find
* x and y such that if gcd(a,b) = 1,
* ax + by = 1.
*/
private static void fullGcd( long a, long b )
{
long x1, y1;
if( b == 0 )
{
x = 1;
y = 0;
}
else
{
fullGcd( b, a % b );
x1 = x; y1 = y;
x = y1;
y = x1 - ( a / b ) * y1;
}
}
/** *//**
* Solve ax == 1 (mod n), assuming gcd( a, n ) = 1.
* @return x.
*/
public static long inverse( long a, long n )
{
fullGcd( a, n );
return x > 0 ? x : x + n;
}
public static long china(long[] n, long[] a) {
// TODO Auto-generated method stub
long n_total = 1L;
final int len = n.length;
for(int i=0;i<len;i++){
n_total *= n[i];
}
long []m = new long[len];
for(int i=0;i<len;i++){
m[i] = n_total / n[i];
}
long []c = new long[len];
for(int i=0;i<len;i++){
c[i] = m[i] * inverse(m[i],n[i]);
}
long a_total = 0L;
for(int i=0;i<len;i++){
a_total += (a[i]*c[i]) % n_total;
}
a_total %= n_total;
return a_total;
}
/** *//**
* @param args
*/
public void test() {
// TODO Auto-generated method stub
long n[] = {5,7,9,11};
long a[] = {4,6,8,0};
//long n[] = {3,5,7};
//long a[] = {2,3,2};
System.out.println(china(n,a));
}
}
我用单元测试一下使用时间:
[img]Finished after 0.005 seconds[/img]
我的算法不会,但是我也是软件工程出生的,略有稍懂,就自己写啦几句实现:
import junit.framework.TestCase;
public class ShareTest extends TestCase{
public void test() {
System.out.println(Long.MAX_VALUE);
for(int i=0;i<Long.MAX_VALUE;i++){
if(i%5==4 && i%7==6 && i%9==8 && i%11==0){
System.out.println("The number is :" + i);
break;
}
}
}
}
我用单元测试一下使用时间:
[img]Finished after 0.005 seconds[/img]
得出的结果竟然惊人的一样,不知道是他分析的算法有问题,还是现在java虚拟机进行拉算法的优化,他在哪撤啦半天的算法,也没有看到效率,哈哈......
分享到:
相关推荐
算法分析论文 本资源摘要信息涵盖了算法分析的基本概念和理论,特别是分支定界算法的原理和实现。通过对算法分析的研究,可以帮助读者更好地理解算法设计和优化的过程,并掌握解决实际问题的能力。 分支定界算法 ...
"算法分析试题答案" 在这篇试题答案中,我们可以学到许多关于算法分析的知识点,下面我们将逐一对其进行解释。 首先,第一个问题是关于二分搜索算法的实现策略,该算法是利用分治策略来实现的。这意味着,二分搜索...
《算法分析与设计:KMP算法的字符串匹配优化》 KMP算法,全称为Knuth-Morris-Pratt算法,是计算机科学中一种用于字符串匹配的高效算法。它避免了在进行比较时出现的不必要的回溯,从而显著提高了匹配效率。在给定的...
回溯算法通过探索所有可能的候选解来找出所有解,如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会丢弃该解,即“回溯”并且在剩余的解空间中继续寻找。回溯算法适合解决约束满足问题,例如八皇后...
为实现三维装箱问题的高效求解,提出了一个三维的剩余空间最优化算法(Three-Dimensional Residual-Space-Optimized Algorithm,3D-RSO)。在满足3个著名约束的条件下,该算法将三维问题转化为带有高度约束的二维...
同时,需要一个变量来跟踪当前时间,以及一个变量来记录正在运行的进程。 通过这种方式,初学者不仅能理解SRTF算法的基本原理,还能实际操作,看到算法如何在不同进程组合下工作。这样的实践项目对于学习操作系统...
给定一个棋盘和棋子,求出从一个位置移动到另一个位置的所有可能路径。 **解决方案**: 可以使用广度优先搜索算法或者深度优先搜索算法解决。根据棋子的具体移动规则进行搜索。 --- #### 题目19:求集合元素问题...
### 100个经典C语言算法分析 #### 绘制余弦曲线 **知识点概述:** 本例通过使用C语言编程技术来绘制0至360度的余弦曲线,利用字符“*”在控制台上模拟曲线。该示例不仅涉及到基本的数学运算和循环结构,还引入了...
首先,创建一个顶点数组,并对每个顶点设置一个标志位表示是否已被访问过。接着,遍历每个顶点,对于入度为0的顶点(没有前驱节点),将其加入到结果序列中,并从图中删除与其相连的边。然后,递归地处理剩余的顶点...
该定理的原理是将每个同余方程转换为一个对应的扩展欧几里德算法问题,通过对每个方程进行这样的转换,然后将所有的解合并起来,即可得到原问题的一个解。在编程实现中国剩余定理时,需要先计算所有模数的乘积,然后...
如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会丢弃该解,即回溯并且在剩余解中继续寻找。报告中以八皇后问题、生成集合全排序问题、生成集合r组合问题、子集和问题等为例,说明了回溯算法的...
在上机实验阶段,学生需调试程序,确保程序输出与预期的算法分析结果一致。同时,需要撰写实验报告,包含实验目的、任务、环境、步骤、结果分析和总结等内容。 **5. 程序实现**中,`chessboard`函数是关键,它接受...
方法是找到第一个从右向左看是递减序列的起始位置,然后在这个位置的右侧找到一个比它大的最小元素,将这两个元素交换位置,再将右侧剩余部分进行递减排序,即可得到下一个排列。 总之,迭代法和穷举搜索法在算法...
它是衡量算法效率的一个重要指标,反映了随着输入规模n的增长,算法执行时间的增长趋势。 2. **问题P的时间复杂度**:是指解决一个问题实例所需的最佳算法的时间复杂度。这里的问题P特指某类问题,例如排序问题、...
《算法分析:递归算法与数据集合的排列数》 在计算机科学中,算法是解决问题的核心,而递归算法作为算法设计的一种重要方法,经常被用于处理复杂的问题。本篇文章将深入探讨递归算法在计算数据集合排列数上的应用。...
算法分析是计算机科学中的核心课程,它关注的是如何理解和评估算法的效率,以及如何设计高效算法来解决实际问题。在给定的试卷内容中,我们可以提取出以下几个关键知识点: 1. **动态规划**:动态规划是一种解决...
在最优装载问题中,如果第一个被装载的集装箱是最轻的,那么剩下的集装箱在剩余载重下的装载问题也是一个最优装载问题。这种性质使得可以通过递归地解决子问题来证明整体解的最优性。 通过贪心选择性质和最优子结构...