在线等待。。。。。。两个常见的算法问题!!有一定的基础请进!! [b][size=12px]1.有两个和尚,一个和尚每三天挑一次水,另一个和尚每年5天挑一次水,当两个和尚感碰到一块,共挑一担水,问:一年365天,共担多少次水。2.河的左岸有10个人,右岸有20个人,只有一条船,每次只能载3个人(包括划船的人)问:最少多少次可以过完?[/[/size]b] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一题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); 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); }} 补充11楼说明1).if(left>=unit && right>=unit){ //这里应该是两岸有人并且都大于或等于船载人数时2).}else{//两岸都有人时应该改为:}else{//两岸都有人时,但小于船载人数时3).可以函数化! //不好意思,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); }} 这题这样想就想得太简单了,这是我的打印结果(只管左、右两边的剩余人数和渡船总次数):left=10,right=20,cnt=0left=7,right=17,cnt=2left=4,right=14,cnt=4left=1,right=11,cnt=6left=0,right=11,cnt=7left=0,right=9,cnt=9left=0,right=7,cnt=11left=0,right=5,cnt=13left=0,right=3,cnt=15left=0,right=0,cnt=16cnt=16 楼主似乎玩失踪啊!!最后一次修正,增强可读性: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); }} 大家都这么无聊,去爆小学生程序比赛吧http://oj.jzxx.net/ 抛开直接计算的不谈,在循环里面,如果这个算正解的话,那么请看下面的算法行不行 int sum = 0; for (int i = 0; i < days; i++) { if (i % 3 == 0 || i % 5 == 0) { sum++; } } System.out.println("sum=" + sum); 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);}2void 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 }}//每特别细致的考虑,大体思路是以人数多的为主,人数少得配合人数多的来做 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); 第一题:算法: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 代码范例。 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 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;} 第二题很多人都没注意到一个隐含条件,就是每次至少有一个人划船过河。也就是说,船不会自己跑过河的。也就是我写的函数里的int minNumOnce = 1; //最少一次过河人数 还好是问一年,要是一千万年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次 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次 第一题: 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)+"担水") 错了第一题是这样的: 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担 htmlParser无法过滤页面中的表单 求一个与排序有关的较好的算法 java 初学者 请告诉支招!!!! jfreechart相关的问题,谢大家帮忙~~~~ 反射机制可以做到么?或者还有别的方法可以做到?? 请教一个字符串的问题 帮帮我! 会CORBA的高手请帮帮我啊? 三天了,,三天没睡了,就因为这个程序,请各位帮帮忙看看!!!!!! 简单问题,需要解答4 请问这样做线程安全吗? 在面试的时候,遇到一个自己以前没有看到过的Java的static用法,好像是一个初级问题,有知道的朋友帮忙解释一下。
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);
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);
}
}
if(left>=unit && right>=unit){ //这里应该是两岸有人并且都大于或等于船载人数时
2).
}else{//两岸都有人时
应该改为:
}else{//两岸都有人时,但小于船载人数时
3).可以函数化!
//不好意思,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);
}
}
这题这样想就想得太简单了,这是我的打印结果(只管左、右两边的剩余人数和渡船总次数):
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
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);
}
}
http://oj.jzxx.net/
for (int i = 0; i < days; i++)
{
if (i % 3 == 0 || i % 5 == 0)
{
sum++;
}
}
System.out.println("sum=" + sum);
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
}
}//每特别细致的考虑,大体思路是以人数多的为主,人数少得配合人数多的来做
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);
算法: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 代码范例。
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;
}
int temp1 = days / 15;
int temp2 = days % 15;
int count = temp1 * 7 + temp2 / 3 + temp2 / 5;// 十五天要挑 15 / 3 + 15 / 5 - 15 / 15 = 7次
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次
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)+"担水")
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担