FooLand奶牛繁殖问题代码疑问:大数计算结果不符
问题分析与代码修正
你的代码存在两个关键问题,这会导致测试用例处理错误以及大数值计算时结果偏差,我们一个个来看:
1. 循环变量名称冲突
你在外层循环用了int i作为测试用例的迭代变量,内层循环又复用了同一个i变量,这会彻底打乱外层循环的逻辑。比如当第一个测试用例的n大于2时,内层循环会把i的值修改为n,之后外层循环的i++会让i直接跳过剩余的测试用例,导致部分用例根本不执行。
举个实际场景:如果T=3,第一个测试用例n=5,内层循环结束后i的值是5,外层循环执行i++变成6,此时6>=3,外层循环直接终止,剩下的2个测试用例完全不会被处理。
2. int类型溢出问题
斐波那契数列增长非常快,int类型的最大值是2^31-1(约21亿),当n超过45时,计算出的奶牛数量就会超过这个值,导致整数溢出,结果变成负数或者错误的数值。而网上的解决方案大概率使用了更大范围的类型(比如long)来避免这个问题。
修正后的代码
我们需要把内层循环的变量改成别的名字(比如j),同时把数组类型换成long来支持更大的数值,另外补充了n=0的边界处理:
import java.util.Scanner; public class CowBreeding { public static void main(String[] args) { Scanner ab = new Scanner(System.in); int t = ab.nextInt(); // 测试用例数 for (int i = 0; i < t; i++) { int n = ab.nextInt(); // 年份 if (n == 0) { System.out.println(1); continue; } long[] arr = new long[n]; arr[0] = 1; if (n >= 2) { arr[1] = 2; for (int j = 2; j < n; j++) { arr[j] = arr[j-1] + arr[j-2]; } } System.out.println(arr[arr.length - 1]); } ab.close(); } }
规律验证补充
我们再确认一下奶牛数量的规律是否正确:
- N=1年:1头(初始小牛1岁,未繁殖)
- N=2年:2头(初始小牛2岁,产下1头)
- N=3年:3头(初始小牛再产1头,去年的小牛1岁)
- N=4年:5头(初始小牛产1头,N=2年的小牛2岁产1头)
- N=5年:8头(初始小牛产1头,N=2、N=3年的小牛各产1头)
这个规律确实符合斐波那契数列,你的核心逻辑是对的,只是被循环变量和溢出问题拖了后腿。
内容的提问来源于stack exchange,提问作者varmashrivastava
相关产品推荐
相关产品推荐

