user-0 提问: 一对兔子，从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死...我写的程序,运行会有问题,求大神看看错在哪..

回复:
user: user-1
content: 引用 14 楼 yyxgs 的回复:[quote=引用 13 楼 whiteduna 的回复:] 太复杂了，其实把问题简单化，就是当前这个月新生的兔子 = 前两个月的兔子总数（生产周期决定），再加上上个月的兔子总数就好了，做一个递归，现在算出来的单位是对，按只*2 public static int totalRabbits(int month) 	{ 		if (month < 3) return 1; 		return totalRabbits(month - 1) + totalRabbits(month - 2); 	}   高手![/quote] 递归求解果然简单

user: user-2
content: 引用 9 楼 m2200 的回复:我是来看赵4老师的解答的。 赵4老师正在赶来的路上

user: user-0
content: 引用 13 楼 whiteduna 的回复:太复杂了，其实把问题简单化，就是当前这个月新生的兔子 = 前两个月的兔子总数（生产周期决定），再加上上个月的兔子总数就好了，做一个递归，现在算出来的单位是对，按只*2 public static int totalRabbits(int month) 	{ 		if (month < 3) return 1; 		return totalRabbits(month - 1) + totalRabbits(month - 2); 	}   高手!

user: user-3
content: 太复杂了，其实把问题简单化，就是当前这个月新生的兔子 = 前两个月的兔子总数（生产周期决定），再加上上个月的兔子总数就好了，做一个递归，现在算出来的单位是对，按只*2 public static int totalRabbits(int month) 	{ 		if (month < 3) return 1; 		return totalRabbits(month - 1) + totalRabbits(month - 2); 	}

user: user-4
content: 你的实现方式太复杂了。   #include <stdio.h> #include <stdint.h> #include <inttypes.h>  #define N (100)   int main(int argc, char **argv) { 	int i; 	uint64_t rabbits[N + 1] = {0}; // 为简化代码，直接在栈上初始化一个数组。根据需要，也可以用malloc来分配空间 	rabbits[0] = rabbits[1] = rabbits[2] = 2; //前三个月的兔子数均为2只 	 	for(i = 3; i <= N; ++i) 	{ 		rabbits[i] = rabbits[i - 1] + rabbits[i - 3]; // 【当月的兔子数】 = 【上月的兔子数】 + 【3个月以前的兔子数】 		printf("%3d: \t count = %"PRIu64"\n", i, rabbits[i]); 	} 		 	return 0; }

user: user-0
content: 引用 4 楼 fornetuse123 的回复:#define _CRT_SECURE_NO_WARNINGS   #include <stdio.h> #include <malloc.h>   /*生兔子*/ void giveBirth_rabbit(int **rabbit, int beforeNumber, int currentNumber) {     int i = 0;       *rabbit = (int*)realloc(*rabbit, currentNumber * sizeof(int));     if (!(*rabbit)) {         printf("兔子增加失败!\n");     }       /*将刚出生的兔子,时间改为1个月*/     for (i = beforeNumber;i < currentNumber;i++) {         *(*rabbit + i) = 1;     } }   /*判断有没有兔子符合生育条件*/ void judgment_rabbit_giveBirth(int* *rabbit, int **rabbitNumber) {     int i = 0;       /*储存出生兔子之前的兔子只数*/     int beforeNumber = **rabbitNumber;       for (i = 0;i < beforeNumber;i++) {           /*符合生兔子的条件*/         if (*(rabbit + i) >= 3) {             ++(**rabbitNumber);               /*增加兔子*/             giveBirth_rabbit(**rabbit, beforeNumber, **rabbitNumber);         }           /*增加出生时间*/         ++(**(rabbit + i));     } }   int main(int argc, char *argv[]) {     int i = 0;       int *rabbit = NULL;     int *rabbitNumber = NULL;       /*分配内存储存兔子和兔子个数*/     rabbit = (int*)calloc(1, sizeof(int));     if (!rabbit) {         printf("兔子创建失败!\n");     }       rabbitNumber = (int*)calloc(1, sizeof(int));     if (!rabbitNumber) {         printf("兔子只数创建失败!\n");     }       /*兔子个数为1对*/    * *rabbitNumber = 1;       for (i = 0;i<100;i++) {           /*判断兔子是否符合出生条件*/         judgment_rabbit_giveBirth(rabbit, rabbitNumber);           printf("第 %d 个月: %d 只兔子!\n", i, **rabbitNumber * 2);     }       return 0; }   红字是更改的地方吗?

user: user-0
content: 引用 3 楼 chehw_1 的回复:你的实现方式太复杂了。   #include <stdio.h> #include <stdint.h> #include <inttypes.h>  #define N (100)   int main(int argc, char **argv) { 	int i; 	uint64_t rabbits[N + 1] = {0}; // 为简化代码，直接在栈上初始化一个数组。根据需要，也可以用malloc来分配空间 	rabbits[0] = rabbits[1] = rabbits[2] = 2; //前三个月的兔子数均为2只 	 	for(i = 3; i <= N; ++i) 	{ 		rabbits[i] = rabbits[i - 1] + rabbits[i - 3]; // 【当月的兔子数】 = 【上月的兔子数】 + 【3个月以前的兔子数】 		printf("%3d: \t count = %"PRIu64"\n", i, rabbits[i]); 	} 		 	return 0; }    高手!

user: user-5
content: 引用 3 楼 chehw_1 的回复:你的实现方式太复杂了。   #include <stdio.h> #include <stdint.h> #include <inttypes.h>  #define N (100)   int main(int argc, char **argv) { 	int i; 	uint64_t rabbits[N + 1] = {0}; // 为简化代码，直接在栈上初始化一个数组。根据需要，也可以用malloc来分配空间 	rabbits[0] = rabbits[1] = rabbits[2] = 2; //前三个月的兔子数均为2只 	 	for(i = 3; i <= N; ++i) 	{ 		rabbits[i] = rabbits[i - 1] + rabbits[i - 3]; // 【当月的兔子数】 = 【上月的兔子数】 + 【3个月以前的兔子数】 		printf("%3d: \t count = %"PRIu64"\n", i, rabbits[i]); 	} 		 	return 0; }   高，实在是高

user: user-5
content: #define _CRT_SECURE_NO_WARNINGS   #include <stdio.h> #include <malloc.h>   /*生兔子*/ void giveBirth_rabbit(int **rabbit, int beforeNumber, int currentNumber) {     int i = 0;       *rabbit = (int*)realloc(*rabbit, currentNumber * sizeof(int));     if (!(*rabbit)) {         printf("兔子增加失败!\n");     }       /*将刚出生的兔子,时间改为1个月*/     for (i = beforeNumber;i < currentNumber;i++) {         *(*rabbit + i) = 1;     } }   /*判断有没有兔子符合生育条件*/ void judgment_rabbit_giveBirth(int* *rabbit, int **rabbitNumber) {     int i = 0;       /*储存出生兔子之前的兔子只数*/     int beforeNumber = **rabbitNumber;       for (i = 0;i < beforeNumber;i++) {           /*符合生兔子的条件*/         if (*(rabbit + i) >= 3) {             ++(**rabbitNumber);               /*增加兔子*/             giveBirth_rabbit(**rabbit, beforeNumber, **rabbitNumber);         }           /*增加出生时间*/         ++(**(rabbit + i));     } }   int main(int argc, char *argv[]) {     int i = 0;       int *rabbit = NULL;     int *rabbitNumber = NULL;       /*分配内存储存兔子和兔子个数*/     rabbit = (int*)calloc(1, sizeof(int));     if (!rabbit) {         printf("兔子创建失败!\n");     }       rabbitNumber = (int*)calloc(1, sizeof(int));     if (!rabbitNumber) {         printf("兔子只数创建失败!\n");     }       /*兔子个数为1对*/    * *rabbitNumber = 1;       for (i = 0;i<100;i++) {           /*判断兔子是否符合出生条件*/         judgment_rabbit_giveBirth(rabbit, rabbitNumber);           printf("第 %d 个月: %d 只兔子!\n", i, **rabbitNumber * 2);     }       return 0; }

user: user-0
content: 引用 9 楼 m2200 的回复:我是来看赵4老师的解答的。   赵老师没来...

user: user-0
content: 引用 8 楼 jack960330 的回复:我总觉得楼主的实现方式过于复杂   嗯的，我把简单的事情复杂化了...

user: user-6
content: 我是来看赵4老师的解答的。

user: user-1
content: 我总觉得楼主的实现方式过于复杂

user: user-7
content: 最后一个for循环是死循环了for (i = 0;;i++)  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 1 楼 qq423399099 的回复:最后一个for循环是死循环了for (i = 0;;i++)  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。   不是那个循环的问题,输出到第4个就不动了....