论坛首页 综合技术论坛

一道算法题看程序员的魅力

浏览 27536 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-07-07  
貌似lz有当标题党的嫌疑啊!算法题和程序员的魅力有关系吗?这让我很是不淡.....定啊!
0 请登录后投票
   发表时间:2011-07-07  
cttnbcj 写道
解个不定方程都不会解的孩子伤不起。。。

3*5*7*x - 11y =1
gcd(3*5*7,11)=1 

欧几里得算法逆向求x,y


啊啊啊,大学里学的那点东西都忘了,是不是大学里学的?
0 请登录后投票
   发表时间:2011-07-08  
楼主的算法没问题,不过给题目的时候,条件不够。
0 请登录后投票
   发表时间:2011-07-08  
不过魅力这个词,没看出来,倒是对有些回帖很无语,这还是程序员吗
0 请登录后投票
   发表时间: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);
    }
}
0 请登录后投票
   发表时间:2011-07-08  
这不是剩余定理吗
0 请登录后投票
   发表时间:2011-07-09  
简单的题目被搞的那么复杂
上学的时候就做过,就一条件(315n-1) % 11 = 0  
唉---悲剧啊---
0 请登录后投票
   发表时间:2011-07-09  
小.平说:黑猫白猫,逮到老鼠就是好猫。
我感觉楼主的方法好,学习了
0 请登录后投票
   发表时间: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;
	}
}

0 请登录后投票
   发表时间:2011-07-09  
对呀,基础扎实,也体现一个程序员的能力。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics