有一道题:
有一只母鸡,每月生一只小母鸡,小母鸡长到每第四个月后每月又生一只小小母鸡,问20个月后母鸡的总数为多少?
写一个程程序解决这个问题
刚遇到的难题, 求一个合适的解决方案, 附代码。
有一只母鸡,每月生一只小母鸡,小母鸡长到每第四个月后每月又生一只小小母鸡,问20个月后母鸡的总数为多少?
写一个程程序解决这个问题
刚遇到的难题, 求一个合适的解决方案, 附代码。
解决方案 »
- 关于tomcat集群+Struts2性能的问题
- Caused by: org.hibernate.HibernateException: unknown Oracle major version [0]
- 怎么让jqgrid分页 我是用struts2+mybatis+spring的
- 生产实习做个什么项目呢?
- EMS和DB操作在同一个事务
- 一个不同寻常的Servlet.service() for servlet action threw exceptionjava.lang.NullPointerException(高分,急急!!!!)
- 这个问题出在哪?怎么解决?
- 高高手请进,关于java地反射。没找到解决方法,不知道是不是java的缺点
- 字符串插入数据库问题
- 发送消息的时候rabbit mq服务处于挂掉的状态。
- spring依赖注入的疑问
- struts2很难缠的错误,不知道是不是BUG
1. 笨办法,计下所有的鸡
2. 找数学规律
[code=Jav]import java.util.ArrayList;
import java.util.List;public class HenGrow {
public static void main(String[] args) {
final int month = 20;
// 方法1: 记录所有的鸡
List<Integer> hen1 = new ArrayList<Integer>();
hen1.add(100); for (int i = 1; i <= month; ++i) {
int size = hen1.size();
for (int j = 0; j < size; ++j) {
hen1.set(j, hen1.get(j) + 1);
if (hen1.get(j) >= 4) {
hen1.add(0);
}
}
} System.out.println(hen1.size()); // 方法2: 本月的鸡数为上一个月的鸡数 + 前4个月的鸡数 (可以生小鸡了,不过鸡好像不是生出来的)
List<Integer> hen2 = new ArrayList<Integer>();
hen2.add(2); // 第一个月有2只鸡: 母鸡+生的一只小鸡
hen2.add(3); // 第二个月有3只鸡
hen2.add(4); // 第三个月有4只鸡
hen2.add(5); // 第四个月有5只鸡 // 从第五个月开始,第一个月生的小鸡可以生小鸡鸡了
for (int i = 5; i <= month; ++i) {
hen2.add(hen2.get(i - 1 - 1) + hen2.get(i - 1 - 4));
}
System.out.println(hen2.get(month - 1));
}
}[/code]
hen1.add(100); 100代表着什么? 而且你没有考虑到, 小鸡长大生小鸡, 小鸡又长大, 再生。。 你没考虑这个问题
Fi代表第i月鸡的数量:
F1=2
F2=3
F3=4
Fi=F(i-1)+F(i-3),这里i>3这样,我们就得到了公式,然后通过编写算法来实现就行了,很简单。公式是关键。
生成方法为:
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n>=3)java 代码[code=Jav]
public class Fibonacci {
public static long fib(int n) {
if (n <= 1) return n;
else return fib(n-1) + fib(n-3);
}
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
for (int i = 1; i <= N; i++)
System.out.println(i + ": " + fib(i));
}
}
[/code]你稍微改一改就可以了。
[code=Jav]import java.util.ArrayList;
import java.util.List;public class HenGrow {
public static void main(String[] args) {
final int month = 10;
// 方法1: 记录所有的鸡
List<Integer> hen1 = new ArrayList<Integer>(); // 保存每只小鸡的年龄,用于判断能否生小鸡鸡
hen1.add(3); for (int i = 1; i <= month; ++i) {
int size = hen1.size();
for (int j = 0; j < size; ++j) {
hen1.set(j, hen1.get(j) + 1); // 增加一岁
} // 如果大于等于4岁,则生一只小鸡
for (int j = 0; j < size; ++j) {
if (hen1.get(j) >= 4) {
hen1.add(0);
}
}
System.out.printf("第%d天:\n\t已有小鸡:%s\n\t刚生小鸡:%s\n",
i,
hen1.subList(0, size),
hen1.subList(size, hen1.size()));
} System.out.println(hen1.size()); // 方法2: 本月的鸡数为上一个月的鸡数 + 前4个月的鸡数 (可以生小鸡了,不过鸡好像不是生出来的)
List<Integer> hen2 = new ArrayList<Integer>();
hen2.add(2); // 第一个月有2只鸡: 母鸡+生的一只小鸡
hen2.add(3); // 第二个月有3只鸡
hen2.add(4); // 第三个月有4只鸡
hen2.add(5); // 第四个月有5只鸡 // 从第五个月开始,第一个月生的小鸡可以生小鸡鸡了
for (int i = 5; i <= month; ++i) {
hen2.add(hen2.get(i - 1 - 1) + hen2.get(i - 1 - 4));
}
System.out.println(hen2.get(month - 1));
}
}[/code]输出:第1天:
已有小鸡:[4]
刚生小鸡:[0]
第2天:
已有小鸡:[5, 1]
刚生小鸡:[0]
第3天:
已有小鸡:[6, 2, 1]
刚生小鸡:[0]
第4天:
已有小鸡:[7, 3, 2, 1]
刚生小鸡:[0]
第5天:
已有小鸡:[8, 4, 3, 2, 1]
刚生小鸡:[0, 0]
第6天:
已有小鸡:[9, 5, 4, 3, 2, 1, 1]
刚生小鸡:[0, 0, 0]
第7天:
已有小鸡:[10, 6, 5, 4, 3, 2, 2, 1, 1, 1]
刚生小鸡:[0, 0, 0, 0]
第8天:
已有小鸡:[11, 7, 6, 5, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1]
刚生小鸡:[0, 0, 0, 0, 0]
第9天:
已有小鸡:[12, 8, 7, 6, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1]
刚生小鸡:[0, 0, 0, 0, 0, 0, 0]
第10天:
已有小鸡:[13, 9, 8, 7, 6, 5, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1]
刚生小鸡:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
36
36 // 10天有36只
hen1.add(3);
3 还是100都无所谓,第一只鸡的年龄,就是为了保证它能生
List <Integer> hen1 = new ArrayList <Integer>(); // 保存每只小鸡的年龄,用于判断能否生小鸡鸡
每个元素保存的是此鸡的年龄,不是鸡的数量,自己想去吧
我用了下面的方法 [code=Jav]public static void main(String[] args) {
for(int i = 1; i <= 20; i++){
int count = bigHen(i);
System.out.println(i + " 天: " + count);
}
}
public static int bigHen(int endMonth){
int count = 1; // 只数
for(int i = 1; i <= endMonth; i++){
if(i >= 4){
count = count + bigHen(endMonth - i); //计算每一只小鸡能生多少只
}
count++;
}
return count;
}[/code]
我算了下,感觉是对的。 但是考官就是说答案是 2745 。 我非常郁闷
考官说的2745,是他把第四个月才开始生小鸡弄成了第三个月就开始生,
if (hen1.get(j) >= 4) { // 把这里的4改成3你就知道问题出在哪了
hen1.add(0);
}
哎,不知道要怎么说,只用10个月,是为了输出的内容少些,好比较,改成20不就好了?
private int age;
private static int counts = 0;
public Cow(int age, int years) {
this.age = age;
grow(years);
counts++;
} public void grow(int years) {
for(int i=0; i<years; i++) {
if(age++ >= 4) {
new Cow(0, years-i);
}
}
}
public static void main(String[] args) {
new Cow(4, 6);
System.out.println(Cow.counts);
}
}[/code]
有一头母牛,从出生起第四个年头开始每年生一头母牛,第n年几头?[code=Jav]
#include<stdio.h>
void main()
{
/*y1表示1岁,y2...,y3..没有y4,是因为到了第四年,就可以生了,所以身份是母亲*/
int sum,mother=1,y1,y2,y3,n;
printf("Enter the Year(n)=: ");
scanf("%d",&n);
if(0<n&&n<4) sum=n;
if(n>=4)
{
for(y1=1,y2=1,y3=1;n>=4;n--)//第6年后,刚好y1,y2,y3都为1。此后每过一年...
{
mother=mother+y3; //三岁的变成母亲。
y3=y2; //2岁的成了三岁
y2=y1; //1岁的--->二岁
y1=mother; //所有的母亲每一年都生下小牛(y1)
sum=mother+y1+y2+y3;
}
}
printf("Sum = %d\n",sum);
}[/code]09年前写的 母牛四年生一只...
几本都一样的。
public class Test {
public static void main(String[] args) {
/*y1表示1岁,y2...,y3..没有y4,是因为到了第四年,就可以生了,所以身份是母亲*/
int sum=0,mother=1,y1,y2,y3,n;
n=20;
if(0<n&&n<4) sum=n;
if(n>=4)
{
for(y1=1,y2=1,y3=1;n>=4;n--)//第6年后,刚好y1,y2,y3都为1。此后每过一年...
{
mother=mother+y3; //三岁的变成母亲。
y3=y2; //2岁的成了三岁
y2=y1; //1岁的--->二岁
y1=mother; //所有的母亲每一年都生下小牛(y1)
sum=mother+y1+y2+y3;
}
}
System.out.println(sum);
}
}[/code]改成了JAVA.. 测试过了。
不过编码规范不够好,那时候刚入门不久·· 可以看着改改。
public static void main(String[] args) {
/*y1表示1岁,y2...,y3..没有y4,是因为到了第四年,就可以生了,所以身份是母亲*/
int sum=0,mother=1,y1,y2,y3,n;
n=20;
if(0<n&&n<4) sum=n;
if(n>=4)
{
for(y1=1,y2=1,y3=1;n>=4;n--)//第6年后,刚好y1,y2,y3都为1。此后每过一年...
{
mother=mother+y3; //三岁的变成母亲。
y3=y2; //2岁的成了三岁
y2=y1; //1岁的--->二岁
y1=mother; //所有的母亲每一年都生下小牛(y1)
sum=mother+y1+y2+y3;
}
}
System.out.println(sum);
}
}
[/code]
{
public static void main( String[] args )
{
System.out.println(getbigHen(1,20)+1);//+1是因为包括母鸡自己!
}
public static int getbigHen(int xiaoji ,int month)
{
if(month!=20)
{
month = month-2;//第一只母鸡不需要4天,为什么这里是2天,因为调用的时候-1了
}
int total = 0;
for(int i=month;i>0;i--)
{
total ++;
total += getbigHen(1,i-1);
}
return total;
}
}
import java.util.List;/**
*
* 有一只母鸡,每月生一只小母鸡,小母鸡长到每第四个月后每月又生一只小小母鸡,问20个月后母鸡的总数为多少? 写一个程程序解决这个问题
*/
public class 小鸡家族 { public static class 小鸡 {
int 生日; 小鸡(int 鸡历月份) {
this.生日 = 鸡历月份;
} public boolean 有娃么(int 世界月份) {
return 世界月份 - this.生日 >= 3;
}
} private static List<小鸡> 族谱 = new ArrayList<小鸡>(); public static void main(String[] args) {
小鸡 小鸡世界的女娲 = new 小鸡(-3); // 浑沌初开 族谱.add(小鸡世界的女娲); for (int m = 1; m <= 20; m++) { int 鸡口 = 族谱.size(); // 先记下鸡口,这月出生的小鸡在这个月的普查后再入家谱。 for (int index = 0; index < 鸡口; index++) {
小鸡 hen = (小鸡) 族谱.get(index); if (hen.有娃么(m)) {
族谱.add(new 小鸡(m));
}
} System.out.println("第 " + m + " 月,鸡口 :" + 族谱.size() + ", 鸡口自然增长:" + (族谱.size() - 鸡口));
} System.out.println("鸡口 :" + 族谱.size());
}
}[/code]
[code=Jav]
...
[/code]
我看到了,现在再试试[code=Jav]123123[/code]
int cal(int month, int num4, int num3, int num2, int num1, int num0) {
return cal(month-1, num4+num3, num2, num1, num4);
}
[/code]其中,month代表月数,num4代表4月后的小鸡数(也就是能生小鸡了),num3是3月大的小鸡数,num2是2月大的小鸡数,num1是1月大的小鸡数,num0是刚出生的小鸡数。哈哈,我写的是不是最简单的啊!
System.out.println(cal(20, 1, 0, 0, 0, 0));
}
就能得到20月后的母鸡数!
{
if (month == 0) {
return num4+num3+num2+num1+num0;
}
return cal(month-1, num4+num3, num2, num1, num0, num4)
}
代码贴错了, 不好意思, 哈哈!
public static int sum(int i){
if (i == 1 || i == 0){
return 1;
}else if (i == 2) {
return 2;
}else {
return sum(i-1) + sum(i-3);
}
}
public static void main(String[] args) {
int mon = feibonaqie.sum(10);
System.out.println(mon);
}}