@Java基础学习
1、f(n)=1+1/2+1/3+…+1/n
代码如下(示例):
2f小数点后两位(四舍五入)
f(n) = 1-1/2+1/3-1/4+…+1/n
代码如下(示例):
public class Hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Double sum = 0.0;
int sign = 1;
for(int i = 1;i <= n; i++)
// 或是 for(int i = 1;i <= n; i++,sign = -sign;)
{
sum += sign*1.0/i; //i++;sign = -sign;
sign = -sign;
// if(i % 2 == 0)
// {
// sum += 1.0/i;
// }
// else
// {
// sum -= 1.0/i;
// }
}
System.out.println(sum);
System.out.printf("%.2f",sum);
}
2.数组
1.用户输入的数字的平均数,并输出所有大于平均数的数?
代码如下(示例):
Scanner in = new Scanner(System.in);
int x ;
double sum=0;
int[] numbers = new int[100]; //定义数组
int cnt = 0;
x = in.nextInt();
while( x != -1)
{
numbers [cnt] = x; //对数组赋值
sum += x;
cnt++;
x = in.nextInt();
}
double average = sum/cnt;
System.out.println("average:"+average);
for(int i=0 ; i<=cnt ; i++)
{
if( numbers[i]>average )
{
System.out.print(numbers[i]+" ");
}
}
结果:
2.数组是一种容器(放东西的东西),特点是:其中所有的元素具有相同的数据类型;一旦创建,不能改变大小。
定义数组变量:
<类型> [ ] <名字> = new <类型> [元素个数]
int [ ] grades = new int [100] ; // gardes[ ];
● 元素个数必须是整数
● 元素个数必须给出
● 元素个数可以是变量
int [ ] a = new int [10] // a[0]开始到a[9]
动态数组
代码如下(示例):
Scanner in = new Scanner(System.in);
double sum=0;
int cnt = in.nextInt();
if(cnt > 0)
{
int[] numbers = new int[cnt]; //定义动态数组
for(int i = 0; i<cnt ; i++)
{
numbers [i] = in.nextInt();
sum += numbers [i];
}
double average = sum/cnt;
System.out.println("average:"+average);
for(int i=0 ; i<cnt ; i++)
{
if( numbers[i]>average )
{
System.out.print(numbers[i]+" ");
}
}
}
for(int i=0 ; i<cnt ; i++) **当i=cnt时,数组会越界**
length:每个数组有一个内部成员length,会告诉你它的元素的数量 遍历数组时: ```c for(int i=0 ; i
数组变量赋值
● 数组变量是数组的管理者而非数组本身
● 数组必须创建出来然后交给数组变量来管理
● 数组变量之间的赋值是管理权限的赋予
● 数组变量之间的比较是判断是否管理同一个数组
int[] a1 = {1,2,3,4,5};
int[] a2 = a1;
for( int i =0 ;i<a2.length; ++i)
{
a2[i]++;
}
for(int i =0 ;i<a1.length; ++i)
{
System.out.println(a1[i]);
}
结果:
int[] a = {1,2,3,4,5};
int[] b = {1,2,3,4,5};
System.out.println(a==b);//a管理a数组,b管理b数组,本质不一样。
false
复制数组
●必须遍历源数组将每个元素逐一拷贝给目的数组
代码如下(示例):
int[] a = {1,2,3,4,5};
int[] b = new int[a.length];
for(int i =0; i<b.length; i++)
{
b[i] = a[i];
}
for(int i=0; i<b.length; i++)
{
System.out.print(b[i]+" ");
}
System.out.println(a==b);
1 2 3 4 5 false
投票统计
代码如下(示例):
Scanner in = new Scanner(System.in);
int x;
int[] numbers = new int[10];
for(int i =0 ;i<numbers.length;i++)
{
System.out.print(i+":"+numbers[i]+" ");
}
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.print(i+":"+numbers[i]+" ");
}
搜索
●在一组给定的数据中,如何找出某个数据是否存在?
代码如下(示例):
Scanner in = new Scanner(System.in);
int[] data = {3,2,5,7,214,53,647,43};
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)+"个");
}
214
214是第5个
遍历数组
for(int i =0; i<data.length; i++)
{
if(x== data[i])
{
loc =i;
break;
}
}
●通常都是使用for循环,让循环变量i从0到<数组的length,这样循环体内最大的i正好是数组最大的有效下标
●常见错误是:
●循环结束条件是<=数组长度,或;
●离开循环后,继续用i的值来做数组元素的下标!
for-each
for(<类型><变量>:<数组>){
}
代码如下(示例):
Scanner in = new Scanner(System.in);
int[] data = {3,2,5,7,214,53,647,43};
int x = in.nextInt();
boolean found = false;
for( int k : data) //遍历data数组 k=3,k=2…
{
if( x==k )
{
found = true;
break;
}
}
if(found)
{
System.out.println(x+"在其中");
}
else
{
System.out.println(x+"不在其中");
}
数组的例子:素数
判断是否能被已知的且<X的素数整除
●构造前50个素数的表
代码如下(示例):
int[] primes = new int[50];
primes[0] = 2;
int cnt = 1; // ①primes数组当前存了一个数据,②下一次数组下标为1
MAIN_LOOP:
for( int x = 3; cnt < 50; x++) //从3开始依次增加 检查是否为素数
{
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+" ");
}
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229
构造素数表
●欲构造n以内的素数表
1.令x为2
2.将2x、3x、4x直至ax<n的数标记为非素数
3.令x为下一个没有被标记为非素数的数,重复2;直到所有的数都已经尝试完毕
代码如下(示例):
boolean[] isPrime = new boolean[100];
for( int i=2; i<isPrime.length; i++) //isPrime默认为0,false
{
isPrime[i] = true;
}
for( int i=2; i<isPrime.length; i++)
{
if( isPrime[i])
{
for( int k=2; i*k<isPrime.length; k++) //素数的倍数都为false
{
isPrime[i*k] = false;
}
}
}
for( int i = 2; i<isPrime.length; i++)
{
if( isPrime[i])
{
System.out.print(i+" ");
}
}
System.out.println();
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
二维数组
● int[][] a = new int[3][5]
●通常理解为a是一个3行5列的矩阵
二位数组的遍历
for( i=0; i<3; i++)
{
for( j=0; j<5; j++)
{
a[i][j] = i*j
}
}
● a[i][j]是一个int
● 表示第i行第j列上的单元
● a[i,j]并不存在
二位数组的初始化
int[][] a = {
{1,2,3,4},
{1,2,3},
};
● 编译器来数数
● 每行一个{},逗号分隔
● 最后的逗号可以存在,有古老的传统
● 如果省略,表示补零
tic-tac-toe游戏
● 读入一个3×3的矩阵,矩阵中的数字为1表示该位置上有一个X,为0表示为O
●程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符X或O,或输出无人获胜
代码如下(示例):
Scanner in = new Scanner(System.in);
final int SIZE = 3;
int[][] board = new int[SIZE][SIZE];
boolean gotResult = false;
int numOfx = 0;
int numOfO = 0;
//读入矩阵
for( int i=0; i<board.length; i++) //i<SIZE
{
for( int j=0; j<board[i].length; j++)//j<SIZE
{
board[i][j] = in.nextInt();
}
}
//检查行
for( int i=0; i<SIZE; i++)
{
numOfx = 0;
numOfO = 0;
for( int j=0; j<SIZE; j++)
{
if( board[i][j] == 1) //X赢
{
numOfx ++;
}
else
{
numOfO ++;
}
}
if(numOfO == SIZE || numOfx == SIZE )
{
gotResult = true;
System.out.println("第"+(i+1)+"行赢");
break;
}
}
//检查列
for( int j=0; j<SIZE; j++)
{
numOfx = 0;
numOfO = 0;
for( int i=0; i<SIZE; i++)
{
if( board[i][j] == 1) //X赢
{
numOfx ++;
}
else
{
numOfO ++;
}
}
if(numOfO == SIZE || numOfx == SIZE)
{
gotResult = true;
System.out.println("第"+(j+1)+"列赢");
break;
}
}
//检查对角线
for( int i=0; i<SIZE; i++)
{
numOfx = 0;
numOfO = 0;
if(board[i][i] == 1)
{
numOfx ++;
}
else
{
numOfO ++;
}
if(numOfO == SIZE || numOfx == SIZE)
{
gotResult = true;
System.out.println("对角线赢");
break;
}
}
//检查反对角线
for( int i=0; i<SIZE; i++)
{
numOfx = 0;
numOfO = 0;
if(board[i][SIZE-i-1] == 1)
{
numOfx ++;
}
else
{
numOfO ++;
}
if(numOfO == SIZE || numOfx == SIZE)
{
gotResult = true;
System.out.println("反对角线赢");
break;
}
}
1 1 1 0 0 0 0 0 0
第1行赢