题目如上图所示:
这道题的重点是:如果一个数出现的次数大于一次,就在输出时使用复数"times"
首先,用户输入的数字并不知道有多少个,所以数组的长度就不容易确定,其次还要记录数字出现的次数,数组存储的每一个数字本身还要和这个数字出现的次数联系起来。不好操作。
解题思路:
既然是读取1~100之间的数字,且数组存储的数字本身还要和这个数字出现的次数联系起来。既然输入的数字个数不确定,导致数组长度不好确定,那就索性创建一个满足题意的最长的数组,创建一个长度为100的数组。
在这个数组中:
index为0的数组单元中存储数字1的出现的次数
index为1的数组单元中存储数字2的出现的次数
。。。。。。。。。。。
index为98的数组单元存储数字99的出现的次数
index为99的数组单元存储数字100的出现的次数
不难发现:
数组的角标和需要存储数字出现次数的这个数字存在关系,即角标+1=数字值,有了这个关系,就可以在知道角标、数字这两个其中一个的值时推算出另一个的值,这样的话,对应数组单元就可以利用来记录对应数字出现的次数,即数组单元存储的就是该数组单元角标对应的数字出现的次数。
代码:
import java.util.Scanner;
class Class29{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int[] intergers = new int[100];
System.out.print("Enter the intergers between 1 and 100:");
int digit = 0;
while(true){ //不知道输入数字的个数,采用while循环
digit = scanner.nextInt();
if(digit==0){
break; //如果输入的数字是0跳出循环,输入结束
}
// 假如digit是3,对应的数字就是2,所以是--digit,然后记录数字存储次数+1,即intergers[2]++
intergers[--digit]++;
}
for(int i=0;i<intergers.length;i++){
if(intergers[i]!=0){
System.out.println((i+1)+" occurs "+intergers[i]+(intergers[i]>1?" times":" time"));
}
}
}
}
运行结果: