数组计算
投票统计
-
写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束
package Mooc.数组;
import java.util.Scanner;
public class Demo06 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x;
int[] numbers = new int[10];
x = in.nextInt();
while (x != -1)
{
if( x>=0 && x<=9)
{
numbers[x] ++;
}
x = in.nextInt();
}
for( int i = 0; i<numbers.length; i++)
{
System.out.println(i+":"+numbers[i]);
}
}
}
遍历数组
搜索
-
在一组给定的数据中,如何找出某个数据是否存在?
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int[] data = {3, 2, 45, 54, 14, 33, 34, 28};
int x = in.nextInt();
int loc = -1;
for( int i = 0; i<data.length; i++)
{
if( x == data[i])
{
loc = i;
break;
}
}
if (loc > -1)
{
System.out.println(x+"是第"+(loc+1)+"个");
}
else
{
System.out.println(x+"不在其中");
}
}
}
for (int i = 0; i<data.length; i++ )
{
if( x == data[i])
{
loc = i;
break;
}
}
-
通常都是使用for循环,让循环变量i从0到<数组的length,这样循环体内最大的i正好是数组最大的有效下标
-
常见的错误是:
-
循环结束条件是<=数组长度,或;
-
离开循环后,继续用i的值来做数组元素的下标!
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int[] data = {3, 2, 45, 54, 14, 33, 34, 28};
int x = in.nextInt();
int loc = -1;
boolean found = false;
for( int i = 0; i<data.length; i++)
{
if( x == data[i])
{
loc = i;
break;
}
}
for ( int k : data )
{
k = 0;
}
for ( int k : data)
{
System.out.println(k);
}
if (loc > -1)
{
System.out.println(x+"是第"+(loc+1)+"个");
}
else
{
System.out.println(x+"不在其中");
}
}
}
for—each
for(<类型> <变量>:<数组> ) { … }
素数
问题:从2到x-1测试是否可以整除
int x = in.nextInt();
boolean isPrime = true;
if ( x == 1 )
{
isPrime = false;
}
for ( int i = 2; i<x; i++ )
{
if ( x % i == 0 )
{
isPrime = false;
break;
}
}
if ( isPrime )
{
System.out.println(x+"是素数");
System.out.println(x+"不是素数");
}
-
对于n要循环n-1遍
-
当n很大时就可以被看作是n遍
改进方法:去掉偶数后,从3到x-1,每次加2 (效率提高)
if ( x == 1 || x%2 == 0 && x!=2 )
{
isPrime = false;
}
else
{
for ( int i = 3; i<x; i+=2 )
{
if ( x % i == 0 )
{
isPrime = false;
break;
}
}
}
-
如果x是偶数,立刻得出结果
-
否则要循环 (n-3)/2+1 遍
-
当n很大时就是 n/2遍
改进方法:无须到x-1,到sqrt(x)就够了
for ( int i = 3; i<Math.sqrt(x); i+=2 ) //平方根
{
if ( x % i == 0 )
{
isPrime = false;
break;
}
}
-
只需要循环sqrt(x)遍
-
从n—> n/2 —> sqrt(n)
改进方法:判断是否能被已知的且<x 的素数整除
-
构造前50个素数的表
import java.util.Scanner;
public class Demo09 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] primes = new int[50];
primes[0] = 2;
int cnt = 1; //1.下一个数要放在primes[1]中; 2.现在只有一个素数在里头
MAIN_LOOP:
for ( int x = 3; cnt<50; x++)
{
for ( int i = 0; i<cnt; i++)
{
if ( x % primes[i] == 0)
{
continue MAIN_LOOP;
}
}
primes[cnt++] = x;
}
for ( int k: primes )
{
System.out.print(k+" ");
}
}
}
改进方法:构造素数表
-
欲构造n以内的素数表
-
令x为2
-
将2x、3x、4x直至ax<n的数标记为非素数
-
令x为下一个没有被标记为非素数的数,重复2;直到所有的数都已经尝试完毕
public class Demo10 {
public static void main(String[] args) {
boolean[] isPrime = new boolean[100];
for ( int i = 2; i<isPrime.length; i++ )
{
isPrime[i] = true;
}
for ( int i = 2; i<isPrime.length; i++ )
{
if( isPrime[i] )
{
for( int k = 2; i*k<isPrime.length; k++ )
{
isPrime[i*k] = false;
}
}
}
for ( int i = 2; i<isPrime.length; i++)
{
if (isPrime[i])
{
System.out.print(i+" ");
}
}
}
}
-
算法不一定和人的思考方式相同