对于google codejam 2008 中的问题陈述:Round 1A Question 3
在这个问题中,您必须找到数字 (3 + √5) n小数点前的最后三位。
例如,当 n = 5 时,(3 + √5) 5 = 3935.73982... 答案是 935。
对于 n = 2,(3 + √5) 2 = 27.4164079... 答案是 027。
我的解决方案基于 T(i) = 6*T(i-1) - 4*T(n-2) + 1,其中 T(i) 是 n=i 的整数部分,如下所示:
#include<stdio.h>
int a[5000];
main(){
unsigned long l,n;
int i,t;
a[0]=1;
a[1]=5;
freopen("C-small-practice.in","r",stdin);
scanf("%d",&t);
for(i=2;i<5000;i++)
a[i]=(6*a[i-1]-4*a[i-2]+10001)%1000;
i=t;
for(i=1;i<=t;i++){
scanf("%ld",&n);
printf("Case #%d: %.3d\n",i,a[(int)n]);
}
fclose(stdin);
}
在a[i]=(6*a[i-1]-4*a[i-2]+10001)%1000;
我知道会有整数溢出的行中,但我不知道为什么通过添加 10,000 我得到了正确的答案。我正在使用 GCC 编译器,其中 sizeof(int)=4
谁能解释发生了什么?