锁定老帖子 主题:一道算法题看程序员的魅力
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-07
貌似lz有当标题党的嫌疑啊!算法题和程序员的魅力有关系吗?这让我很是不淡.....定啊!
|
|
返回顶楼 | |
发表时间:2011-07-07
cttnbcj 写道 解个不定方程都不会解的孩子伤不起。。。
3*5*7*x - 11y =1 gcd(3*5*7,11)=1 欧几里得算法逆向求x,y 啊啊啊,大学里学的那点东西都忘了,是不是大学里学的? |
|
返回顶楼 | |
发表时间:2011-07-08
楼主的算法没问题,不过给题目的时候,条件不够。
|
|
返回顶楼 | |
发表时间:2011-07-08
不过魅力这个词,没看出来,倒是对有些回帖很无语,这还是程序员吗
|
|
返回顶楼 | |
发表时间:2011-07-08
最后修改:2011-07-08
liuyin045 写道 有一问题:说一个屋里有多个桌子,有多个人?
如果3个人一桌,多2个人。 如果5个人一桌,多4个人。 如果7个人一桌,多6个人。 如果9个人一桌,多8个人。 如果11个人一桌,正好。请问这屋里多少人? java程序员的解法: public class Sum11 { public static void main(String [] args){ int sum=11; for (int i=1; i<1000 ; i++)//当人数在11000内时 { sum=11*i; if (sum%3 ==2 && sum%5==4 && sum%7==6 && sum%9==8 ) { System.out.println("sum=" + sum);//屋里有的人数 System.out.println("desk=" + sum/11);//屋里有多个桌子 System.out.println(); } } } } 当人数在11000内时,设sum为人数,desk为桌子 结果有三种: sum=2519, desk=229; sum=5984 ,desk= 544; sum=9449, desk=859. 这是程序的魅力所在,程序员不可忘的基本功,这是我们程序员存在的真正价值。我们对技术充满激情,又不断地坚强学习,与时俱进发挥我们的能量,为了心中的理想而奋斗不止,无悔于心。 楼主的解法本身就有问题,你在取余的时候没有考虑桌子够不够。况且这题本身也有问题,从题目隐含的条件来看,桌子是允许为空的,并且没坐满的算多的人。既然允许为空,则桌子数就不定,你只能问最少有多少张桌子。 如果还不明白,可以通过你的答案来反推。 2519个人时,229张桌子 刚好每桌11个人。当然是对的。但你这个答案对其它条件并不满足,如每桌3个人的时候,2519人需要839张桌子才余2个人。 这个题和最小公倍数的题很类似,可以用最小公倍数的思路去解 我们来看题目 如果3个人一桌,多2个人。 如果5个人一桌,多4个人。 如果7个人一桌,多6个人。 如果9个人一桌,多8个人。 这个是有规律的:如果多一个人的话,则都刚好够坐,说明人数是3,5,7,9的公倍数减1 同时9是3的倍数,所以人数肯定为5*7*9的倍数减1 同时这个数还要满足整除11 可以建立如下算法模型 n=1 人数 x = n*5*7*9-1 且 x%11==0 桌子数 y=x/3 用java描述如下: 这样只需要经过8次迭代即可算出最小满足条件的人数和桌子数 public class Test { public static void main(String[] arg){ int personCount = 0; int deskCount = 0; int step = 5*7*9; int i = 1; while (true){ personCount = step*i -1; if(personCount%11 ==0){ break; } i++; } System.out.println("总人数为 " + personCount) ; deskCount = personCount/3; System.out.println("总桌子数为 " + deskCount) ; System.out.println("计算次数为 " + i); } } |
|
返回顶楼 | |
发表时间:2011-07-08
这不是剩余定理吗
|
|
返回顶楼 | |
发表时间:2011-07-09
简单的题目被搞的那么复杂
上学的时候就做过,就一条件(315n-1) % 11 = 0 唉---悲剧啊--- |
|
返回顶楼 | |
发表时间:2011-07-09
小.平说:黑猫白猫,逮到老鼠就是好猫。
我感觉楼主的方法好,学习了 |
|
返回顶楼 | |
发表时间:2011-07-09
最后修改:2011-07-09
小弟觉得这个结果应该很多,贴上自己的一段代码,高手多多指教
public class PeopleCount { public static void main(String args[]) { double sum=0; while(true) { sum++; if(getResult(sum,3)==2 && getResult(sum,5)==4 && getResult(sum,7)==6 && getResult(sum,9)==8 && getResult(sum,11)==0) break; //System.out.println("there are "+(long)sum+" people"); } System.out.println("there are "+(long)sum+" people"); } //传入除数和被除数得到余数 public static long getResult(double sum,long i) { long res=0; res=(long)sum%i; return res; } } 以上是获得第一个结果,以下是所有结果: public class PeopleCount { public static void main(String args[]) { double sum=0; while(true) { sum++; if(getResult(sum,3)==2 && getResult(sum,5)==4 && getResult(sum,7)==6 && getResult(sum,9)==8 && getResult(sum,11)==0) //break; System.out.println("there are "+(long)sum+" people"); } //System.out.println("there are "+(long)sum+" people"); } //传入除数和被除数得到余数 public static long getResult(double sum,long i) { long res=0; res=(long)sum%i; return res; } } |
|
返回顶楼 | |
发表时间:2011-07-09
对呀,基础扎实,也体现一个程序员的能力。
|
|
返回顶楼 | |