在博客园上看到一个小牛发啦一个剩余算法的分析:
一个婚宴,安排来客,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算法,是计算机科学中一种用于字符串匹配的高效算法。它避免了在进行比较时出现的不必要的回溯,从而显著提高了匹配效率。在给定的...
回溯算法通过探索所有可能的候选解来找出所有解,如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会丢弃该解,即“回溯”并且在剩余的解空间中继续寻找。回溯算法适合解决约束满足问题,例如八皇后...
同时,需要一个变量来跟踪当前时间,以及一个变量来记录正在运行的进程。 通过这种方式,初学者不仅能理解SRTF算法的基本原理,还能实际操作,看到算法如何在不同进程组合下工作。这样的实践项目对于学习操作系统...
给定一个棋盘和棋子,求出从一个位置移动到另一个位置的所有可能路径。 **解决方案**: 可以使用广度优先搜索算法或者深度优先搜索算法解决。根据棋子的具体移动规则进行搜索。 --- #### 题目19:求集合元素问题...
为实现三维装箱问题的高效求解,提出了一个三维的剩余空间最优化算法(Three-Dimensional Residual-Space-Optimized Algorithm,3D-RSO)。在满足3个著名约束的条件下,该算法将三维问题转化为带有高度约束的二维...
其原理基于扩展欧几里德算法,即可以将每个方程转化为一个扩展欧几里德算法问题,然后通过递归的方式求出最终的解。 在实际应用中,扩展欧几里德算法和中国剩余定理广泛应用于密码学、加密算法、数据分析等领域。 ...
### 100个经典C语言算法分析 #### 绘制余弦曲线 **知识点概述:** 本例通过使用C语言编程技术来绘制0至360度的余弦曲线,利用字符“*”在控制台上模拟曲线。该示例不仅涉及到基本的数学运算和循环结构,还引入了...
首先,创建一个顶点数组,并对每个顶点设置一个标志位表示是否已被访问过。接着,遍历每个顶点,对于入度为0的顶点(没有前驱节点),将其加入到结果序列中,并从图中删除与其相连的边。然后,递归地处理剩余的顶点...
如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会丢弃该解,即回溯并且在剩余解中继续寻找。报告中以八皇后问题、生成集合全排序问题、生成集合r组合问题、子集和问题等为例,说明了回溯算法的...
在上机实验阶段,学生需调试程序,确保程序输出与预期的算法分析结果一致。同时,需要撰写实验报告,包含实验目的、任务、环境、步骤、结果分析和总结等内容。 **5. 程序实现**中,`chessboard`函数是关键,它接受...
方法是找到第一个从右向左看是递减序列的起始位置,然后在这个位置的右侧找到一个比它大的最小元素,将这两个元素交换位置,再将右侧剩余部分进行递减排序,即可得到下一个排列。 总之,迭代法和穷举搜索法在算法...
它是衡量算法效率的一个重要指标,反映了随着输入规模n的增长,算法执行时间的增长趋势。 2. **问题P的时间复杂度**:是指解决一个问题实例所需的最佳算法的时间复杂度。这里的问题P特指某类问题,例如排序问题、...
《算法分析:递归算法与数据集合的排列数》 在计算机科学中,算法是解决问题的核心,而递归算法作为算法设计的一种重要方法,经常被用于处理复杂的问题。本篇文章将深入探讨递归算法在计算数据集合排列数上的应用。...
算法分析是计算机科学中的核心课程,它关注的是如何理解和评估算法的效率,以及如何设计高效算法来解决实际问题。在给定的试卷内容中,我们可以提取出以下几个关键知识点: 1. **动态规划**:动态规划是一种解决...
在最优装载问题中,如果第一个被装载的集装箱是最轻的,那么剩下的集装箱在剩余载重下的装载问题也是一个最优装载问题。这种性质使得可以通过递归地解决子问题来证明整体解的最优性。 通过贪心选择性质和最优子结构...