打印“黑色星期五”
核心思想:判断每一年的13号是否为星期五,把问题细化,判断每年的每个月的13号是否为星期五,采用Java自带的日期处理类Calendar提供的方法能够很容易的获得。
程序运行结果:
程序代码如下:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;
public class Ch2_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
System.out.print("请输入起始年份");
int year=input.nextInt();
System.out.print("请输入未来几年");
int n=input.nextInt();
getBlackFri(year,n);
}
public static void getBlackFri(int year,int n) {
//日期格式对象
SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd E");
int k=0;
//获取日历对象
Calendar cal= Calendar.getInstance();
while (k<n) {//外循环控制年份
for(int i=0;i<12;i++) {//控制月份
cal.set(year, i,13);
if(5==(cal.get(Calendar.DAY_OF_WEEK)-1)) {
//输出格式化日期
System.out.println("黑色星期五:" +sdf.format(cal.getTime()));
}
}
year++;
k++;
}
}
}
计算个人所得税
程序运行结果:
程序代码如下:
import java.util.Scanner;
public class Ch2_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("请输入个人收入:");
Scanner input=new Scanner(System.in);
double sr=input.nextDouble();
System.out.print("应交个人所得税:"+getTax(sr));
}
public static double getTax(double sal) {
double t=0;
double b=sal-3500;
if(b<=500) {
t=b*0.05;
return t;
}
else if(b<=2000) {
t=25+(b-500)*0.1;
return t;
}
else if(b<=5000) {
t=175+(b-2000)*0.15;
return t;
}
else if(b<=20000) {
t=625+(b-5000)*0.2;
return t;
}
else if(b<=40000) {
t=3625+(b-20000)*0.25;
return t;
}
else if(b<=60000) {
t=8625+(b-40000)*0.3;
return t;
}
else if(b<=80000) {
t=14625+(b-60000)*0.35;
return t;
}
else if(b<=100000) {
t=21625+(b-80000)*0.4;
return t;
}
else {
t=29625+(b-100000)*0.45;
return t;
}
}
}
存钱问题
核心思想:递推,数组
题目要求:
父亲准备为小龙的大学四年生活一次性储蓄一笔钱,使用整存零取的方式,控制小龙每个月初取1000元准备这个月使用。
假设银行整存零取的年息为1.71%。请算出父亲至少需要存入多少钱才能行
程序运行结果:
程序代码如下:
public class Ch2_3 {
public static final double MONEYRATE=0.0171;//存款利率
public static void main(String[] args) {
// TODO Auto-generated method stub
double money[]=new double[48];//定义一个数组,用来装每个月月初剩下的存款
money[47]=1000;//最后一个月为1000
System.out.printf("48月初的剩余存款数为:%2f\n",money[47]);
//通过逆递推算出前一个月的剩余存款
for(int i=47;i>0;i--) {
money[i-1]=1000+money[i]/(1+MONEYRATE/12);
System.out.printf("%d月初的剩余存款数为:%.2f\n",i,money[i-1]);
}
System.out.printf("\n 最初要存入%.2f元",money[0]);
}
}
赛场统分
题目要求:
在编程竞赛中,有10个评委为参赛的选手打分,分数为0-100。选手最后的得分是去掉一个最高分去掉一个最低分后其余八个分数的平均值。请编写一个程序实现。
核心思想:最大值最小值求和
程序运行结果:
程序代码如下:
import java.util.Scanner;
public class Ch2_4 {
public static void main(String[] args) {
int i,max=0,min=100,sum=0;
int x[]=new int [10];
for(i=0;i<10;i++) {
System.out.printf("请输入第"+(i+1)+"人的分数");
Scanner input =new Scanner(System.in);
x[i]=input.nextInt();
sum=sum+x[i];
if(x[i]>max) {
max=x[i];
}
if(x[i]<min) {
min=x[i];
}
}
System.out.printf("去掉一个最高分和一个最低分:"+max+"、"+min);
System.out.print(" \n");
System.out.printf("最后的平均分为:"+(sum-min-max)/8);
}
}
肇事车辆
题目要求:一个卡车司机肇事后想逃跑,但是被三个人看见了车牌号,但是都没看全,甲说:“车牌的前两位是一样的” 乙说:车牌的后两位是一样的,但与前两位不一样 丙说:车牌是一个数字的平方。请编写一个程序计算该车牌号是多少(车牌号四位数)。
核心思想: 典型的穷举法类型。可将平方作为查找的判断条件四位数最小为1000 最大为9999 则应该为30到100之间才有可能是1000到10000
程序运行结果:
程序代码如下:
public class Ch2_5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int t;
for(int i=1;i<=9;i++) {//i为最高位的数字
for(int j=0;j<=9;j++) {//j为最低位的数字
if(i!=j) {
t=1000*i+100*i+10*j+j;
for(int k=30;k<100;k++) {
if(k==Math.sqrt(t)) {
System.out.printf("车牌号码是:"+k*k);
}
}
}
}
}
}
}
分糖果
题目要求:
10个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分给右边的小孩,糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每个人各有多少块糖?
核心思想:确定大概框架:用数组记录分糖个数,如果糖果数不相等,则进行分糖果,同时奇数个糖果再向老师要+1,最后输出分糖果次数以及每个人最后分到的糖果数。
程序运行结果:
程序代码如下:
public class Ch2_6 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int tang[]= {10,2,8,22,16,4,10,6,14,20};
int times=0;//分糖果的次数,初始为0
while(isSame(tang)==false) {
int m=tang[9];//为防止第10个小孩的糖果被覆盖,先进行保留备份
for(int i=9;i>0;i--) {
tang[i]=tang[i]/2+tang[i-1]/2;
}
tang[0]=tang[0]/2+tang[9]/2;//最后一个小孩分得的糖果数
times++;//糖果分的次数
System.out.printf("第"+times+"次后分得的结果为:");
show(tang);
for(int i=0;i<10;i++) {
if(tang[i]%2!=0) {
tang[i]+=1;
}
}
}
System.out.println("分糖果次数为:"+times);
System.out.println("每个人最终分得的糖果数:"+tang[0]);
}
public static boolean isSame(int[] a) {
int n=0;
boolean b=false;
for(int i=0;i<a.length-1;i++) {
if(a[i]==a[i+1]) {//相邻两个数相等,计数器加1
n++;
}
if(n==a.length-1) {//如果全部相等
b=true;
}
}
return b;
}
public static void show(int[] a) {
if(a==null) {//判断数组为空
System.out.println("Array=null");
}
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
}