[b][size=12px]1.有两个和尚,一个和尚每三天挑一次水,另一个和尚每年5天挑一次水,当两个和尚感碰到一块,共挑一担水,问:一年365天,共担多少次水。
2.河的左岸有10个人,右岸有20个人,只有一条船,每次只能载3个人(包括划船的人)问:最少多少次可以过完?
[/[/size]b]

解决方案 »

  1.   

    第一题int days=365;
    int cnt1=0,cnt2=0,common=0;
    for(int i=1;i<=days;i++){
    if(i%15==0){//如果相遇的话
    common++;
    }else{
    if(i%3==0){
    cnt1++;
    }
    if(i%5==0){
    cnt2++;
    }
    }
    }
    int result=cnt1+cnt2+common;
    System.out.println("result="+result);
      

  2.   

    public class RiverExchange {

    public static void main(String[] args) {
    int left=10,right=20; //可任意设定人数
    int unit=3;
    int cnt=0;
    while(!(left==0 && right==0)){
    if(left>=unit && right>=unit){
    left-=unit;
    right-=unit;
    cnt+=2;  //完成一次交互
    }else{
    if(left>0 && right==0){//如果只有左岸有人时
    if(left-unit==0){
    left=0;
    cnt++; //最后一次
    }else{
    left=left-unit+1; //则有一人要返回
    cnt+=2; //一个往返
    }
    }else if(right>0 && left==0){//如果只有右岸有人时
    if(right-unit==0){
    right=0;
    cnt++;  //最后一次
    }else{
    right=right-unit+1; //则有一人要返回
    cnt+=2; //一个往返
    }
    }else{//两岸都有人时
    if(left<unit && left>0){
    left=0;
    cnt++;
    }else if(right<unit && right>0){
    right=0;
    cnt++;
    }else{
    //不会出现的情况,什么也不做
    }
    }
    }

    System.out.println("left="+left+",right="+right);
    }

    System.out.println("cnt="+cnt);
    }
    }
      

  3.   

    补充11楼说明1).
    if(left>=unit && right>=unit){ //这里应该是两岸有人并且都大于或等于船载人数时
    2).
    }else{//两岸都有人时
    应该改为:
    }else{//两岸都有人时,但小于船载人数时
    3).可以函数化!
      

  4.   


    //不好意思,12楼中的代码有点小BUG,修正如下:public class RiverExchange {

    public static int getCount(int left, int right, int unit){
    int cnt=0;
    while(!(left==0 && right==0)){
    if(left>=unit && right>=unit){
    left-=unit;
    right-=unit;
    cnt+=2;  //完成一次交互
    }else{
    if(left>0 && right==0){//如果只有左岸有人时
    if(left-unit<=0){ //这里有11楼代码有点不同
    left=0;
    cnt++; //最后一次
    }else{
    left=left-unit+1; //则有一人要返回
    cnt+=2; //一个往返
    }
    }else if(right>0 && left==0){//如果只有右岸有人时
    if(right-unit<=0){ //这里有11楼代码有点不同
    right=0;
    cnt++;  //最后一次
    }else{
    right=right-unit+1; //则有一人要返回
    cnt+=2; //一个往返
    }
    }else{//两岸都有人时
    if(left<unit && left>0){
    left=0;
    cnt++;
    }else if(right<unit && right>0){
    right=0;
    cnt++;
    }else{
    //不会出现的情况,什么也不做
    }
    }
    }
    System.out.println("left="+left+",right="+right+",cnt="+cnt);
    }

    return cnt;
    }

    public static void main(String[] args) {
    int left=10,right=20; //左边和右边的人数(可自行设定)
    int unit=3; //船载人数(可自行设定)
    int cnt=getCount(left, right, unit);
    System.out.println("cnt="+cnt);
    }
    }
      

  5.   


    这题这样想就想得太简单了,这是我的打印结果(只管左、右两边的剩余人数和渡船总次数):
    left=10,right=20,cnt=0
    left=7,right=17,cnt=2
    left=4,right=14,cnt=4
    left=1,right=11,cnt=6
    left=0,right=11,cnt=7
    left=0,right=9,cnt=9
    left=0,right=7,cnt=11
    left=0,right=5,cnt=13
    left=0,right=3,cnt=15
    left=0,right=0,cnt=16
    cnt=16
      

  6.   

    楼主似乎玩失踪啊!!最后一次修正,增强可读性:public class RiverExchange { public static int getCount(int left, int right, int unit) {
    int count = 0;
    while (!(left == 0 && right == 0)) { // 如果双方都已过河时退出循环
    if (left >= unit && right >= unit) { // 两岸都有人,但人数范围都是 x>=unit
    left -= unit;
    right -= unit;
    count += 2; // 完成一次交互
    } else if (left > 0 && right == 0) {// 如果只有左岸有人时
    if (left - unit <= 0) {
    left = 0;
    count++; // 最后一次
    } else {
    left = left - unit + 1; // 则有一人要返回
    count += 2; // 一个往返
    }
    } else if (right > 0 && left == 0) {// 如果只有右岸有人时
    if (right - unit <= 0) {
    right = 0;
    count++; // 最后一次
    } else {
    right = right - unit + 1; // 则有一人要返回
    count += 2; // 一个往返
    }
    } else {// 两岸都有人但人数范围都为 0<x<unit
    if (left < unit) {
    left = 0;
    count++;
    }
    if (right < unit) {
    right = 0;
    count++;
    }
    } System.out.println("left=" + left + ", right=" + right + ", count=" + count);
    } return count;
    } public static void main(String[] args) {
    int left = 10, right = 20; // 左边和右边的人数(可自行设定)
    int unit = 3; // 船载人数(可自行设定)
    System.out.println("left=" + left + ", right=" + right + ", count=" + 0);
    int count = getCount(left, right, unit);
    System.out.println("cnt=" + count);
    }
    }
      

  7.   

    大家都这么无聊,去爆小学生程序比赛吧
    http://oj.jzxx.net/
      

  8.   

    抛开直接计算的不谈,在循环里面,如果这个算正解的话,那么请看下面的算法行不行        int sum = 0;
            
            for (int i = 0; i < days; i++)
            {
                if (i % 3 == 0 || i % 5 == 0)
                {
                    sum++;
                }
            }
            
            System.out.println("sum=" + sum);
      

  9.   

    c++代码,俺对java不熟
    1,
    void main()
    {
      int cnt1=0,cnt2=0,share=0,day1,day2;
      scanf("第一个人第一次是第几天挑水?",&day1);
      scanf("第二个人第一次是第几天挑水?",&day2);
      assert(day1<=3 && day1>=1 && day2<=5 && day2>=1);
      for(int i=1;i<=365;++i)
      {
        if(i==day1 && i==day2)
        {
          ++share;
          day1+=3;
          day2+=5;
        }
        else if(i==day1)
        {
          ++cnt1;
          day1+=3;
        }
        else if(i==day2)
        {
          ++cnt2;
          day2+=5;
        }
      }
      printf(cnt1+cnt2+share);
    }
    2
    void main()
    {
      int num1,num2,cnt1=0,cnt2=0;
      bool boat_start_at_group1;
      scanf("第一组人数",&num1);
      scanf("第二组人数",&num2);
      scanf("初始时船在第一组人一边",boat_start_at_group1);
      assert(num1>0&&num2>0);
      if(num1>num2 && num1<=3*num2)
      {
         print("times", ceil(num1/3)*2-1);
         return;
      }
      else if(num1>3*num2)
      {
         print("times", num2*2+1 + ceil((num1-num2*3-3)/2)*2);
      }
      else
      {
         //相反的逻辑,和上面的两个if
      }
    }//每特别细致的考虑,大体思路是以人数多的为主,人数少得配合人数多的来做
      

  10.   


    bool bflag1 = false;
    bool bflag2 = false;

    int iCount = 0;
    for(int i = 1; i <= 365; ++i)
    {

    if(i % 3 == 0)
    {
    bflag1 = true;
    } if(i % 5 == 0)
    {
      bflag2 = true;
    } if(bflag1 && bflag2)
    {
    iCount++;
    } bflag1 = false;
    bflag2 = false;
    } printf("num = %d",iCount);
      

  11.   

    第一题:
    算法:365 / 3 + 365 / 5 - 365 / 15
    结果:170第二题:
    算法:(int)(Math.ceil(10 / 3.0) + Math.ceil((20 - Math.ceil(10 / 3.0) * 3) / 2.0))
    结果:8注意:以上均为Java 代码范例。
      

  12.   

    r->l 3 l->r 3r->l 3 l->r 3r->l 3 l->r 1r->l 3 l->r 1r->l 3 l->r 1r->l 3 l->r 1r->l 2
      

  13.   

    int rightPeople=20;
    int leftPeople=10;
    int maxNumOnce = 3; //最多一次过河人数
    int minNumOnce = 1; //最少一次过河人数int getMinTimesToThrough(int rightPeople,int leftPeople,int maxNumOnce, int minNumOnce){
    //人数较多的一边的人数
    int moreSidePeople = rightPeople > leftPeople ? rightPeople:leftPeople;//人数较少的一边的人数
    int lessSidePeople = rightPeople < leftPeople ? rightPeople:leftPeople;//人数较多的一边的最少过河的次数
    int minMoreSideTimes = moreSidePeople/maxNumOnce;
    //人数较少的一边的最多过河的次数
    int maxLessSideTimes = lessSidePeople/minNumOnce;int minTimes = 0;if(minMoreSideTimes < maxLessSideTimes ){
      minTimes = minMoreSideTimes ;
    }
    else{
      minTimes  = maxLessSideTimes+(moreSidePeople-maxLessSideTimes*maxNumOnce)/(maxNumOnce-minNumOnce);
    }return minTimes;
    }
      

  14.   

    第二题很多人都没注意到一个隐含条件,就是每次至少有一个人划船过河。也就是说,船不会自己跑过河的。也就是我写的函数里的int minNumOnce = 1; //最少一次过河人数
      

  15.   

    还好是问一年,要是一千万年for循环要跑几秒种了吧,其实可以直接计算的int days=365;
    int temp1 = days / 15;
    int temp2 = days % 15;
    int count = temp1 * 7 + temp2 / 3 + temp2 / 5;// 十五天要挑 15 / 3 + 15 / 5 - 15 / 15 = 7次
      

  16.   

    int j=0;
    int m=0,n=0;
    for(int i=1;i<=365;i++){
    if(i%3==0 && i%5!=0){m++;}
    if(i%5==0 && i%3!=0){n++;}
    if(i%3==0 && i%5==0){
    j++;
    System.out.println(i);
    }

    }
    System.out.println("A和尚自己挑"+m+"次");
    System.out.println("B和尚自己挑"+n+"次");
    System.out.println("AB和尚碰到"+j+"次");
    System.out.println("AB和尚总共挑"+((m+n)+j)+"次");A和尚自己挑97次
    B和尚自己挑49次
    AB和尚碰到24次
    AB和尚总共挑170次
      

  17.   

    第一题: int days=365;
    int iCount=0;
    int kCount=0;
    for(int i=1;i<=days;i+=3){
        iCount++;
       for(int k=1;k<=days;k+=5){
          kCount++;
          if((i+k)%(3*5)==0){
              kCount--;     //或者iCount--;  因为是共挑一担水 
          }
       }}
    System.out.println("他们共同挑了"+(iCount+kCount)+"担水")
      

  18.   

    错了第一题是这样的:  int count = 0;
    for(int i = 0; i < 365; i++)
    {
        if (i % 3 == 0 || i % 5 == 0)
        {
             count++;
        }
    }

    System.out.println("他们共同挑了"+count+"担水");
    System.out.println(365/3 + 365/5 - 365/15);//都是170担