【2.1】求明天是星期几
public class study {
public static void main(String args[])
{
short i=7;
short tomorrow,yesterday;
tomorrow = (short) ((i+1) % 7);
yesterday = (short)((i-1+7) % 7);
System.out.print(“tomorrow:”+tomorrow+" “+”\n");
System.out.print(“yesterday:”+yesterday);
}
}
【2.2】判断一个年份是否为闰年
public class study {
public static void main(String args[])
{
int year = 2020;
boolean leap = year%4000||(year%100!=0&&year%40); //先计算表达式,再赋值
System.out.println(year+" is a leap year? "+leap);
}
}
【2.3】Fibonacci数列
public class Fibonacci {
public static void main(String args[])
{
short i=0,j=1;
do
{
System.out.print(" “+i+” "+j);
i = (short)(i+j); //两个short整数运算后结果使int类型,类型强制转换后才能赋值
j = (short)(i+j);
}while(i>0); //short整数溢出时循环停止,不是死循环
System.out.println();
}
}
【2.4】求一个日期是星期几
public class study {
public static void main(String args[])
{
int year = 2020, month = 9, day = 1;
boolean leap = year%4000||year%40&&year%100!=0; //判断闰年
int total = year-1980+(year-1980+3)/4; //求平(闰)年累计的总天数
for (int i = month-1;i>0;i–) //计算当年前n-1个月累计的天数
switch(i)
{
case 1:case 3:case 5:case 7:case 8:case 10:total+=31;break;
case 4:case 6:case 9:case 11:total+=30;break;
case 2:total+=leap?29:28;
}
total+=day; //当月的天数
int week = 1; //起始日1979-12-31是星期一
week = (week+total)%7; //求得星期几
System.out.print(year+“年”+month+“月”+day+“日 星期”);
switch(week)
{
case 0:System.out.print(“日”);break;
case 1:System.out.print(“一”);break;
case 2:System.out.print(“二”);break;
case 3:System.out.print(“三”);break;
case 4:System.out.print(“四”);break;
case 5:System.out.print(“五”);break;
case 6:System.out.print(“六”);break;
}
}
}
【2.5】用一维数组表示Fibonacci数列
public class study {
public static void main(String args[])
{
int n = 25,i, fib[]= new int[n];
fib[0]=0;
fib[1]=1;
for(i=2;i<n;i++)
fib[i]=fib[i-1]+fib[i-2];
for(i=0;i<fib.length;i++)
System.out.print(" "+fib[i]);
System.out.println();
}
}
【2.6】幻方
public class study {
public static void main(String args[])
{
int n = 3, mat[][]=new int[n][n]; // n是阶数
int i=0,j=n/2; //i和j作为下标,首个数放在第一行中间位置
for(int k=1;k<=n*n;k++) //k是自然数
{
mat[i][j]=k; //当前位置取值
if(k%n==0) //对角线已满
i=(i+1)%n; //下一位置像下一行
else
{
i=(i-1+n)%n; //下一位置向右上方
j=(j+1)%n;
}
}
for(i=0;i<mat.length;i++) //输出二维数组
{
for(j=0;j<mat[i].length;j++)
System.out.print(mat[i][j]+"\t");
System.out.println();
}
}
}
【2.7】一维整数数组排序
public class study {
public static int[] random(int n,int max) //产生n个0~max之间的随机数,返回一维数组
{
int value[] =new int[n];
for(int i=0;i<value.length;i++)
value[i] = (int)(Math.random()*max); //random()返回一个0~1的double随机数
return value;
}
public static void print(int value[]) //输出一维数组元素,数组作为参数
{for(int i=0;i<value.length;i++)System.out.print(" "+value[i]);System.out.println();
}//选择直接排序。数组作为引用类型参数,实际参数的元素值将被改变
public static void selectsort(int value[])
{for(int i=0;i<value.length-1;i++) //n-1趟排序{int min=i;for(int j=i;j<value.length;j++) //在从value[i]开始的部分数组元素中if(value[j]<value[min]) //寻找最小值min = j; //min记录下本趟最小值的下标if(i!=min){int temp=value[i]; //本趟最小值交换到左边value[i]=value[min];value[min]= temp;}}
} //设X.Y数组已按升序排序,merge()方法将两者合并成一个排序数组返回,一次归序算法
public static int[] merge(int X[],int Y[])
{int Z[]=new int[X.length+Y.length], i=0,j=0,k=0;while (i<X.length&&j<Y.length) //将X中两个相邻子序列归并到Y中{if(X[i]<Y[i]) //较小值复制到Y中Z[k++]=X[i++];else Z[k++]=Y[j++];}while(i<X.length) //将前一个子序列剩余元素复制到X中Z[k++]=X[i++]; while(j<Y.length) //将后一个子序列剩余元素复制到Y中Z[k++]=Y[j++];return Z;
}
public static void main(String args[])
{int n1=7,max1=100;int table1[] = random(n1,max1);System.out.print("table1:");print(table1);selectsort(table1);System.out.print("sorted table1:");print(table1);int table2[] = random(n1,max1);System.out.print("table2:");print(table2);selectsort(table2);System.out.print("sorted table2:");print(table2);System.out.print("merge:");print(merge(table1,table2));
}
}
【2.8】杨辉三角
public class study {
public static int[][] yanghui(int n) //求n行杨辉三角,返回二维数组
{
int mat[][] = new int[n][]; //申请第一维的存储空间
for (int i=0;i<n;i++)
{
mat[i] = new int[i+1]; //申请第二维的存储空间
mat[i][0]=mat[i][i]=1;
for(int j=1;j<i;j++)
mat[i][j]=mat[i-1][j-1]+mat[i-1][j];
}
return mat; //返回二维数组引用
}
public static void print(int mat[][]) //输出二维数组
{
for(int i=0;i<mat.length;i++)
{
for(int j=0;j<mat[i].length;j++)
System.out.print(" "+mat[i][j]);
System.out.println();
}
}
public static void main(String args[])
{
print(yanghui(10));
}
}
【2.9】求Fibonacci数列第n项的递归方法。
public class study {
public static int fibonacci(int n) //求Fibonacci数列的第n项,递归方法
{
if(n<0)
return -1;
if(n0||n1)
return n;
return fibonacci(n-2)+fibonacci(n-1);
}
public static void main(String args[])
{
System.out.print(fibonacci(10));
}
}
【2.10】从标准输入流中读取一行字符串,再转换成整数。(两个类)
public class Input{
//从标准输入流中读取一行字符串返回,以回车换行符结束
public static String readLine() throws java.io.IOException //抛出IO异常
{
System.out.print(“输入一行字符串,以回车换行符结束:”);
byte buffer[] = new byte[512]; //以字节数组作为缓冲区
int count = System.in.read(buffer); //从标准输入流读字节到缓冲区buffer,返回读取字节数
System.in.close(); //关闭标准输入流
return(count==-1)?null:new String(buffer,0,count-2); //若只输入Ctrl+Z,
//关闭标准输入流,则count==-1,返回null;若只输入回车换行符,则count==2,返回空串“”;
//否则,返回由buffer数组种从0开始count-2字节构造的串,不计回车换行符
}
public static void main(String args[])throws java.io.IOException //抛出IO异常交java虚拟机处理
{
String s=readLine(); //从标准输入流中读取一行字符串
int value = MyInteger.parseInt(s); //将字符串s转换成整数,自动识别进制
System.out.println(“MyInteger.toString(”+value+",2)="+MyInteger.toString(value,2));
System.out.println(“MyInteger.toString(”+value+",16)="+MyInteger.toString(value,16));
}
}
public class MyInteger {
//返回将字符串s转换的整数,自动识别进制,十、八、十六进制分别以正负号及1~9/0、0x开头。。若s不能转换成整数,则抛出数值格式日常
public static int parseInt(String s)throws NumberFormatException
{
if(snull)
throw new NumberFormatException(“null”); //抛出数值格式异常
char ch=s.charAt(0); //获得首字母,识别进制
int value=0,i=0,sign=1,radix;
if(ch>=‘1’&&ch<=‘9’||ch’+’||ch==’-’) //十进制以正负号及1~9开头
{
radix=10;
if(ch==’+’||ch==’-’) //跳过正负号,只有十进制可输入±
i++; //i记住当前字符序号
sign=ch==’-’?-1:1; //识别正负号,记住正负数标记
}
else if(ch==‘0’&&s.charAt(1)!=‘x’) //八进制以0开头
{
radix=8;
i++;
}
else if(ch==‘0’&&s.charAt(1)‘x’) //十六进制以0x开头
{
radix=16;
i+=2;
}
else throw new NumberFormatException(“整数不能识别’”+ch+"'字符");
while(i<s.length()) //获得无符号整数绝对值
{
ch=s.charAt(i++);
if(ch>=‘0’&&ch-‘0’<radix) //当radix<=0时,radix只需识别数字0~radix-1
value=value*radix+ch-‘0’; //value记住当前获得的整数值
else if(radix16&&ch>=‘a’&&ch<=‘f’)
value=valueradix+ch-‘a’+10; //十六进制还需转换’a’到’f’表示的整数值
else if(radix==16&&ch>=‘A’&&ch<=‘F’)
value=valueradix+ch-‘A’+10;
else throw new NumberFormatException(radix+“进制整数不能识别’”+ch+"'字符");
}
return value*sign; //返回有符号整数值
}
//返回整数value的radix进制字符串,radix取值为2,4,8,16,采用位运算
public static String toString(int value,int radix)
{if (radix==10)return value+""; //返回将value值转换成十进制的字符串if(radix==2||radix==4||radix==8||radix==16){int mask,n=0; //mask获得radix进制的最大数字for(mask=radix-1;mask>0;mask>>>=1)n++; //n获得mask的二进制位数,即2"=radixmask=radix-1;char buffer[]=new char[(int)(32.0/n+0.5)]; //存储一个int表示为radix的各位for(int i=buffer.length-1;i>=0;i--){ //除radix取余法,余数存入buffer字符数组(逆序),高位补0int bit=value&mask; //获得radix进制的个位数字buffer[i]=(char)(bit<=9?bit+'0':bit+'a'-10); //将0~9、10~15转换为‘0’~‘9’、‘a'~'f'value>>>=n; // 右移n位,高位补0,即value除以radix }return new String(buffer); //返回由字符数组构造的字符串}throw new IllegalArgumentException("radix参数值"+radix+"表示的进制无效。"); //无效参数异常
}
}