hello 大家好
今天学习了一些有关java算法:
1.算法:解决问题的基本步骤,和实现方案
业务处理中的算法问题:
分析问题找规律
针对规律写代码
2.九九乘法口诀表
问题分析 : 1*1=1
1*2=2 2*2=2
1*3=3 2*3=6 3*3=9
我们发现规律 第几行有几个乘法式,需要两个遍历,从1-9行遍历,然后1-9列遍历
public class ReturnTest { public static void main(String[] args) { ReturnTest.ceshi(); } public static void ceshi() { for(int i=1;i<=9;i++) { for(int j=1;j<=i;j++) { System.out.print(i+"x"+j+"="+i*j); System.out.print("\t"); } System.out.println(); } } }
我们调用我们的方法,查看结果
这样我们的九九乘法口诀表就打印出来了。
涉及的知识点,字符转义序列\t 水平制表符的使用。
两层循环的嵌套使用。
我们来看第二个问题:
中国有句俗语叫"三天打鱼两天晒网".现在请计算 A.若2010.1.16开始打渔, 问:2010年12月1日,该人打鱼还是晒网?
我们分析一下这个问题,起始时间和截止时间我们知道。这样总天数就知道,而三天打渔两天晒网,我们可以知道五天一个周期,这样我们用总天数来对5取余,得到0,1,2,3,4四种结果,而123则打渔,04晒网
这样我们还一个问题就是年分平年和闰年,会有一天的差别。这样我们先判别年是闰年还是平年,在总天数加上1天,或者按平年算。
public class ReturnTest { public static void main(String[] args) { ReturnTest //.ceshi(); .dayu(); } public static void dayu() { int sum;//总天数 int y=2010; if(y%400==0||(y%4==0&&y%100!=0)) { sum=365-15-30+1; } else sum=365-15-30+1; String msg=((sum/5)>=1&&(sum/5)<=3)?"打渔":"晒网"; System.out.println("该员工在这天 "+ msg); } }
这里边涉及到:闰年的检测方法,
Java中唯一的三元表达式 (表达式1)?表达式2:表达式3; 相当于if(表达式一)真的话选择表达式2,假的话选择表达式3;
我们来看一下这个题的变形
假设该人员从2000年1月1日开始从事打鱼工作,那么今天应该打鱼还是晒网?
public class Test1 { static int[] msg2={31,28,31,30,31,30,31,31,30,31,30,31}; public static void main(String[] args) { Date date=new Date(2004, 1, 1); System.out.println(4*365+1); System.out.println(Test1.way1(date)); } public static String way1(Date date) { int count1=0,count2=0;//count1:闰年的数量,count2:整年数 int day=0;//除去整年剩下的天数 for(int i=2001;i<=date.getYear();i++) { count2=i-2000; System.out.println("年:"+count2); if((i%4==0 && i%100!=0)||i%400 == 0) { count1++; if(date.getMonth()<2||(date.getMonth()==2&&date.getDay()<29)) count1--; } } for(int j=0;j<date.getMonth()-1;j++) { day=msg2[j]+day; System.out.println("剩下的天:"+day); } int sum;//到今天的总天数 sum=day+date.getDay()+365*count2+count1; System.out.println(sum); String msg=(sum%5 >= 1&& sum%5 <= 3)?"打渔":"晒网"; return msg; } } class Date { private int year; private int month; private int day; public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public Date(int year,int month,int day) { this.year=year; this.month=month; this.day=day; } }
这是我刚写的 ,不知道对错!嘿嘿,等明天被人家检查啦 再来公布。我感觉写的有点麻烦,自己写了一个时间类。我感觉java内部肯定有。
第三个问题
问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?
分析一下题目:
猴子最后一天的加1乘以2就是前一天的数量;这样我们就可以用一个循环来从第十天倒着回去
public class ReturnTest { public static void main(String[] args) { ReturnTest //.ceshi(); //.dayu(); .houzi(); } public static void houzi() { int num=1; for(int i=9;i>0;i--) { num=(num+1)*2; } System.out.println("猴子摘得总数是 :"+num); } }
这样就得到第一天猴子摘桃的数量啦。
第四个问题:
马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女人和小孩,在一家饭馆吃饭,总共花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令;问男人、女人和小孩各有几人?
我们来分析一下这个问题:
三十个人必须有男人x,女人y,小孩z,并且满足x+y+z=30;
共花了50先令,3*x+2*y+z=50;
我们可以联立两个等式,y=20-2x; z=10-x;而且我们可以判断x的数量1-9;我们就可以枚举法来获取所有的可能组合
public class ReturnTest { public static void main(String[] args) { ReturnTest //.ceshi(); //.dayu(); //.houzi(); .chifan(); } public static void chifan() { int x,y,z; for(x=1;x<10;x++) { y=20-2*x; z=10-x; System.out.println("男人:"+x+"女人:"+y+"小孩 :"+z); } } }
这样我们可以获取三人的所有组合情况;