- /**题目:有10袋金币,每袋100个。其中一袋全是假的,真的重10克,假的重9克。计算几次可以知道哪袋是假的。
- *分析:本题其实很简答,只要数学基础不太差,几乎不费吹灰之力就做出来。给10袋金币编号1至10,从第1袋
- *拿1块金币,从第2袋拿两块金币...从第10袋拿10块金币,把拿出的55块金币放到一起去称,如果第1袋为假,
- *则总重量为549克,如果第2袋为假,则总重量为548克,... 如果第10袋为假,则总重量为540克。所以只需称
- *一次就可知哪袋是假的。将解题过程转换成java程序的步骤如下:
- *1、定义1个Random变量,用于生成1至10的某个数
- *2、定义1个2维int数组(10*100),用于保存每块金币的重量。
- *3、打印每袋金币的第一块金币的重量(因为每袋有100块,全部打印出来共1000个整数,有点吓人)
- *4、定义一个int变量sum用于保存取出的金币的总重量。
- *5、10 - sum%10 表示假金币的编号
- */
-
- import java.util.*;
- public class Calculate{
- public static void main(String[] args){
- Random rand = new Random();//定义一个随机数种子rand
- int bagNum = rand.nextInt(10) + 1;//那袋假金币编号为1至10中的某个数,rand.nextInt(10)产生
- //0至9中的某个数,所以后面要加1
- int[][] arr = new int[10][100];//定义一个二维数组的引用
-
- for(int i = 0; i < arr.length; i++)
- arr[i] = new int[100];//定义10个一维数组的引用
-
- for(int i = 0; i < arr.length; i++){
- //因为数组下标是从0开始的,所以假金币编号对应的数组下标是bagNum - 1
- if(i == (bagNum - 1)){
- for(int j = 0; j < arr[i].length; j++)
- arr[i][j] = 9;//每块假金币的重量都是9克
- }
- else{
- for(int j = 0; j < arr[i].length; j++)
- arr[i][j] = 10;//每块真金币的重量都是10克
- }
- }
-
- for(int i = 0; i < arr.length; i++)
- System.out.println("第" + (i+1) + "袋每块金币重 " + arr[i][0] + " 克");
-
- int sum = 0;//sum用于存储拿出的55块金币的总重量
- /**从第1袋拿1块金币,从第2袋拿两块金币...从第10袋拿10块金币,i+1表示拿出的金币
- 数量,arr[i][0]表示金币的重量*/
- for(int i = 0; i < arr.length; i++)
- sum += (i+1) * arr[i][0];//每迭代一次都加上新拿出的金币的重量
-
- System.out.println("\n经过1次计算,可知第 " + (10 - sum%10) + " 袋金币为假");
-
- }
- }
复制代码 |