You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:41:36