(3)打擂求最大值、最小值 假设评委打分都是整数,我们可以先用两个变量max、min分别存放最低分0分,最高分100,通过一个循环语句,实现打擂,代码如下:
for(i=0;i<10;i++) {
if(x>max) max=x[i]; if(x (4)累加求和 通过一个循环语句,实现累加求和,代码如下: for(i=0;i<10;i++) { sum=sum+x[i] } (5)完整程序 现在我们就需要把刚才的程序进行组合,构成我们的完整程序: import java.util.Scanner; public class ch2_4 { public static void main(String[] args) { int i,max,min,sum; int x[]=new int[10]; max=0; //注意,这里存放最小值0 min=100; //注意,这里存放最大值100 sum=0; for(i=0;i<10;i++) //循环10次,给10个人打分 { System.out.print(\请输入第\分数:\ Scanner input=new Scanner(System.in); x[i]=input.nextInt(); //键盘接收分数,存入数组 sum=sum+x[i]; //累加求和 //通过打擂方式求最大值、最小值 if(x[i]>max)max=x[i]; if(x[i] System.out.println(\去掉一个最高分和一个最低分:\、\ System.out.println(\平均分:\ } } 2.5 肇 事 车 辆 1.问题描述 有一个卡车司机肇事后想逃跑,但是被三个人看见了其车牌号,但是都没看全,甲说:车牌的前两位是一样的;乙说:车牌的后两位是一样的,但与前两位不一样;丙说:车牌是一个数字的平方,请编写一个程序计算该车牌号是多少(车牌号4位数)。 2.问题分析 这是一个典型的穷举法的问题。根据问题描述,我们可以从1100开始判断是不是一个数字的平方,如果是,就是我们要的车牌号,如果不是,再换下一个数1122试试,依此类推,把可能的情况都试一次。 (1)确定程序框架 通过前面的问题分析,我们可以假设车牌号最前一位为i,最后一位为j,通过循环判断i、j组成的数是不是一个平方数。程序的框架如下: public class ch2_5 { public static void main(String[] args) { ... //i代表最高位上的数字 for (int i = 1; i <= 9; i++) { //j代表最低位上的数字 for (int j = 0; j <= 9; j++) { //i、j组成的四位数是不是一个平方数 } } } } (2)平方数判断 程序的关键在于,i、j组成的数是不是平方数,由问题描述可知,车牌号前两位和后两位都是一样的数字,所以,很容易通过i、j写出这个车牌号:iijj,代码如下: //i、j组成的四位数 t=i*1000+i*100+j*10+j; 车牌表示出来后,我们可以通过循环判断这个数是不是1的平方、2的平方、??、n的平方。如果是,就找到了。为了缩小比较范围,4位数如果是一个数的平方,那么这个数应该介于1000的平方根与10000的平方根之间。我们可以通过一次循环实现判断,代码如下: //k的取值根据四位数字开平方得到的大概范围 for (int k = 30; k < 100; k++) { if (k == Math.sqrt(t)) { //车牌号找到了 } } (3)完整程序 现在我们就需要把刚才的程序进行组合,构成我们的完整程序: public class ch2_5 { public static void main(String[] args) { int t; //i代表最高位上的数字 for (int i = 1; i <= 9; i++) { //j代表最低位上的数字 for (int j = 0; j <= 9; j++) { if(i!=j) //题目要求,两位不相等 { //i、j组成的四位数 t=i*1000+i*100+j*10+j; //k的取值根据四位数字开平方得到的大概范围 for (int k = 30; k < 100; k++) { if (k == Math.sqrt(t)) //判断是否是平方数 { System.out.println(\车牌号码:\ } } } } } } } (4)运行结果 运行程序,结果如图2.5所示。 2.6 分 糖 果 1.问题描述 10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖? 2.问题分析 分糖的过程是一个重复的过程。根据分糖的游戏规则,我们不停地重复分糖的步骤,我们可以用一个数组存放每个小孩手中的糖,通过循环修改数组中的数,最终达到都相等为止。 (1)确定程序框架 通过前面的问题分析,我们可以定义一个数组存放10个小孩的糖,如果数组里的值不相等就通过循环修改数组的值,修改完后接着判断是不是有奇数,如果有就加1,然后再判断是否相等,不相等再分,循环反复,直至相等为止。程序的框架如下: public static void main(String args[]) { int tang[]={10,2,8,22,16,4,10,6,14,20}; int times=0; //记录分糖果次数 //如果小孩手中的糖果不相等,就继续分糖果 while(isSame(tang)==false) { //分糖果 times++; //次数加1 //糖果为奇数的向老师要糖果 } System.out.println(\分糖果次数:\ System.out.println(\每个人最终的糖果个数:\ } } (2)分糖果 由问题描述可知,所有的小孩同时将手中的糖分一半给右边的小孩,为了防止最后一个小孩的糖果个数被覆盖了,我们可以先把最后一个小孩(即第10个小孩)的糖果个数先临时保存下来,然后把第9个小孩的糖果一半加上第10个小孩的糖果一半给第10个小孩,依次,把第8个小孩的糖果一半加上第9个小孩的糖果一半给第9个小孩,??,把第1个小孩的糖果一半加上第2个小孩的糖果一半给第2个小孩,最后把临时保存下来的第10个小孩的糖果个数一半加上第1个小孩的糖果一半给第1个小孩,这样分糖果分了一遍。代码如下: int m=tang[9]; //防止被覆盖,备份 for(int i=9;i>0;i--) //循环分糖果 { tang[i]=tang[i]/2+tang[i-1]/2; } tang[0]=tang[0]/2+m/2; //最后一个小孩分糖果 (3)糖果为奇数的向老师要糖果 由问题描述可知,糖块数为奇数的人可向老师要一块。这个问题比较简单,我们可以通过循环判断数组中的数字是不是奇数,进而是否加1操作。代码如下: //糖果为奇数的向老师要糖果 for(int i=0;i<10;i++) if(tang[i]%2!=0) tang[i]+=1; (4)判断每个小孩手中的糖果个数是否相等 由问题描述可知,是否继续分糖的条件是,每个小孩手中的糖果是否一样多。我们可以采用循环比较数组相邻两个数字是否相等,相等则计数器(初始值为0)的个数加1,如果个数全相等,那么计数器的值应该为数组的长度减1。代码如下: public static boolean isSame(int[] a) { int n=0; boolean b=false; //是否相等,标志 for(int i=0;i if(a[i]==a[i+1]) //如果相邻两个数相等,计数器加1 { n++; } if(n==a.length-1) //全部相等判断