练习1:写一个程序,打印从1到100的值。
public class Exercise4_1 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
}
}
练习2:写一个程序,产生25个int类型的随机数,对于每一个随机数,使用if-else语句来将其分类为大于、小于,或等于紧随它而随机产生的值。
public class Exercise4_2 {
public static void main(String[] args) {
Random random =new Random(47);
for (int i = 0; i < 25; i++) {
int a = random.nextInt();
int b = random.nextInt();
if(a > b) {
System.out.println(a+"大于"+b);
}else if(a < b) {
System.out.println(a+"小于"+b);
}else {
System.out.println(a+"等于"+b);
}
}
}
}
练习3:修改练习2,把代码用一个while无限循环包括起来。然后运行它直至用键盘中断其运行(通常是通过按Ctrl+c).
public class Exercise4_3 {
public static void main(String[] args) {
while(true) {
Random random =new Random(47);
for (int i = 0; i < 25; i++) {
int a = random.nextInt();
int b = random.nextInt();
if(a > b) {
System.out.println(a+"大于"+b);
}else if(a < b) {
System.out.println(a+"小于"+b);
}else {
System.out.println(a+"等于"+b);
}
}
}
}
}
练习4:写一个程序,使用两个嵌套的for循环和取余操作符(%)来探测和打印素数(只能被其自身和1整除,而不能被其它数字整除的整数)。
public class Exercise4_4 {
public static void main(String[] args) {
for (int i = 1; i < 100; i++) {
for (int j = 2; j < i; j++) {
if(i%j==0) {
break;
}else if(i%j!=0&&i==j+1) {
System.out.println(i);
}
}
}
}
}
public class Exercise4_4 {
public static void main(String[] args) {
for (int i = 2; i <= 100; i++) {
boolean flag = true;
for (int j = 2; j < i; j++) {
if(i%j==0) {
flag = false;
break;
}
}
if(flag) {
System.out.println(" "+i);
}
}
}
}
练习5:重复第3章中的练习10,不要用Integer.toBinaryString()方法,而是用三元操作符和按位操作符来显示二进制的1和0。
public class Exercise4_5 {
private static void toBinaryString(int i) {
char[] buffer = new char[32];
int bufferPosition = 32;
do {
buffer[--bufferPosition] = ((i & 0X01) == 0) ? '0':'1';
i>>>=1;
}while(i!=0);
for (int j = 0; j < buffer.length; j++) {
System.out.print(buffer[j]);
}
System.out.println();
}
public static void main(String[] args) {
int i1 = 0Xaaaaaaaa;
int i2 = 0x55555555;
System.out.print("i1 = ");toBinaryString(i1);
System.out.print("i2 = ");toBinaryString(i2);
System.out.print("~i1 = ");toBinaryString(~i1);
System.out.print("~i2 = ");toBinaryString(~i2);
System.out.print("i1&i1 = ");toBinaryString(i1&i1);
System.out.print("i1|i1 = ");toBinaryString(i1|i1);
System.out.print("i1^i1 = ");toBinaryString(i1^i1);
System.out.print("i1&i2 = ");toBinaryString(i1&i2);
System.out.print("i1|i2 = ");toBinaryString(i1|i2);
System.out.print("i1^i2 = ");toBinaryString(i1^i2);
}
}
练习6:修改前两个程序中的两个test()方法,让他们接受两个额外的参数begin和end,这样在测试testval时将判断它是否在begin和end之间(包含begin和end)的范围内。
public class Exercise4_6 {
static boolean Test(int testval,int begin,int end) {
boolean result = false;
if(testval>=begin&&testval<=end) {
result = true;
}
return result;
}
public static void main(String[] args) {
System.out.println(Test(10, 5, 15));
System.out.println(Test(5, 10, 15));
System.out.println(Test(5, 5, 5));
}
}
练习7:修改本章练习1,通过使用break关键词,使得程序在打印99时退出。然后尝试使用return来达到相同的目的。
public class Exercise4_7 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
if(i==99) {
break;
}
System.out.println(i);
}
}
}
练习8:写一个switch开关语句,为每个case打印一条消息。然后把这个switch放进for循环来测试每个case。先让每个case后面都有break,测试一下会怎样,然后把break删了,看看会怎样。
public class Exercise4_8 {
public static void main(String[] args) {
for (int i = 0; i < 7; i++) {
switch (i) {
case 0:
System.out.println(i);
break;
case 1:
System.out.println(i);
break;
case 2:
System.out.println(i);
break;
case 3:
System.out.println(i);
break;
case 4:
System.out.println(i);
break;
default:
System.out.println("default");
break;
}
}
}
}
练习9:一个斐波那契数列由数字1、1、2、3、5、8、13、21、34等等组成的,其中每个数字(第三个数字起)都是前两个数字的之和。创建一个方法,接受一个整数参数,并显示从第一个元素开始总共由该参数指定的个数所构成的所有斐波那契数字
public class Exercise4_9 {
public static void main(String[] args) {
int x = 10;
switch (x) {
case 1:
System.out.println("1");
break;
case 2:
System.out.println("1,1");
break;
default:
int a=1,b=1;
for (int i = 0; i < x; i++) {
if(i<2) {
System.out.print("1,");
}else {
System.out.print(a+b+",");
int tem =b;
b=a+b;
a =tem;
}
}
break;
}
}
}
public class Exercise4_9 {
static int fib(int n) {
if(n<=2) {
return 1;
}
return fib(n-1)+fib(n-2);
}
public static void main(String[] args) {
for (int i = 1; i <=10; i++) {
System.out.print(fib(i)+" ");
}
}
}
练习10: 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字包含乘积一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字就是“吸血鬼”数字:
1260 = 21*60
1827 = 21*87
2187 = 27*81
写一个程序,找出4位数的所有吸血鬼数字。
public class Exercise4_10 {
public static void main(String[] args) {
int []startDigit = new int[4];
int []productDigit = new int[4];
for (int i = 10; i <=99; i++) {
for (int j = 10; j <=99; j++) {
if(((i*j)%9)!=((i+j)%9)) {
//吸血鬼数字必然满足这个条件
continue;
}
int product = i*j;
startDigit[0]=i/10;
startDigit[1]=i%10;
startDigit[2]=j/10;
startDigit[3]=j%10;
productDigit[0] = product/1000;
productDigit[1] = product/100%10;
productDigit[2] = product%100/10;
productDigit[3] = product%10;
int count = 0;
for (int k = 0; k < 4; k++) {
for (int k2 = 0; k2 < 4; k2++) {
if(productDigit[k]==startDigit[k2]) {
count++;
startDigit[k2] =-1;
productDigit[k] =-2;
if(count==4) {
System.out.println(product);
}
}
}
}
}
}
}
}
public class Exercise4_10 {
public static void main(String[] args) {
VampireNum();
}
static void f(int x,int y,int m,int n,int i) {
if((x*10+y)*(m*10+n)==i) {
System.out.println(x+","+y+","+m+","+n);
System.out.println(i);
}
}
static void VampireNum() {
for (int i = 1000; i < 10000; i++) {
int a =i/1000;
int b =i/100%10;
int c =i%100/10;
int d =i%10;
f(a,b,c,d,i);
f(a,b,d,c,i);
f(a,c,b,d,i);
f(a,c,d,b,i);
f(a,d,b,c,i);
f(a,d,c,b,i);
f(b,a,c,d,i);
f(b,a,d,c,i);
f(b,c,d,a,i);
f(b,d,c,a,i);
f(c,a,d,b,i);
f(c,b,d,a,i);
}
}
}