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);
}
}
}
这样我们可以获取三人的所有组合情况;